我使用 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_,...
… 等等。
显然,如果基础结果集太大,这(a)会遇到严重问题,而(b)与分页根本没有太大关系:-(
有人遇到过同样的问题吗?
更新 :似乎NHibernate(Hibernate的.NET实现)利用Row_Number()了T-SQL 的功能。可惜的是Hibernate没有…
Row_Number()
回复迟了一点,但可能会有所帮助,所以我将其发布。遇到了完全相同的问题,并且很难找到答案。解决方案是使用org.hibernate.dialect.SQLServer2012DialectHibernate 4.3.0中包含的方法。生成的查询变为(粘贴没有列名和别名的真实Hibernate转储):
org.hibernate.dialect.SQLServer2012Dialect
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()函数的用法。他们终于解决了!
Row_number()