sql-server – Hibernate(/ JPA)服务器端分页和MS SQL Server
发布时间:2020-12-12 07:02:08 所属栏目:MsSql教程 来源:网络整理
导读:我使用hibernate / JPA实现服务器端数据分页,底层数据库是MS SQL Server 2008. SQL生成如下: criteria.setFirstResult(pagingParams.getDisplayStart()).setMaxResults(pagingParams.getDisplayLength()); (主要工作在于创建适当的过滤器/排序,但这与此无关)
我使用hibernate / JPA实现服务器端数据分页,底层数据库是MS SQL Server 2008.
SQL生成如下: criteria.setFirstResult(pagingParams.getDisplayStart()) .setMaxResults(pagingParams.getDisplayLength()); (主要工作在于创建适当的过滤器/排序,但这与此无关) 我正在观察的是以下SQL: page (0-20): select top 20 this_.id as id11_9_,... page (20-40): select top 40 this_.id as id11_9_,... page (40-60): select top 60 this_.id as id11_9_,... … 等等. 显然,如果底层结果集太大而且(b)与分页没什么关系,那么(a)将遇到严重问题:-( 谁有同样的问题? 更新:好像是NHibernate(Hibernate的.NET实现)takes advantage的T-SQL的Row_Number()函数.遗憾的是Hibernate不… 解决方法有点迟到的反应,但它可能会有所帮助,所以我会发布它.有完全相同的问题和头痛来追踪它.解决方法是使用Hibernate 4.3.0中包含的org.hibernate.dialect.SQLServer2012Dialect.生成的查询变为(粘贴没有列名和别名的真正的Hibernate转储):WITH query AS (SELECT inner_query.*,Row_number() OVER ( ORDER BY CURRENT_TIMESTAMP) AS __hibernate_row_nr__ FROM (SELECT TOP(?) <COLUMN_NAMES> AS <ALIASES> FROM <TABLE_NAME> ) inner_query) SELECT <ALIASES> FROM query WHERE __hibernate_row_nr__ >= ? AND __hibernate_row_nr__ < ? 注意内部查询和Row_number()函数的用法.他们终于解决了! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |