sql-server – Hibernate(/ JPA)服务器端分页和MS SQL Server

前端之家收集整理的这篇文章主要介绍了sql-server – Hibernate(/ JPA)服务器端分页和MS SQL Server前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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()函数用法.他们终于解决了!

猜你在找的MsSQL相关文章