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

标签 sql-server sql-server-2008 hibernate jpa orm

我用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 实现)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()函数的用法。他们终于解决了!

关于sql-server - Hibernate (/JPA) 服务器端分页和 MS SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9868775/

相关文章:

sql - 在 "removing"尾随空格后选择不同的

使用带有 varchar 列的 PIVOT 的 SQL Server 2008 R2 不起作用

asp.net - 从Docker容器到主机中SQL Server dblocal的连接字符串

c# - Entity Framework 连接无法识别创建的临时表

java - 如何使用hibernate将结果集从mysql映射到pojo?

sql - SQL "DELETE"语句后跟 "WHERE NOT IN"语句可以在同一个事务中吗?

sql-server-2008 - 如何使用 freeTDS 和 unixODBC 配置 pyodbc 以正确接受来自 SQL Server 的字符串?

sql-server - 如何删除 SQL Server Management Studio "Connect to Server"屏幕中的服务器条目?

java - hibernate 多对多加入条件

hibernate - 何时/如何以编程方式设置 Hibernate 使用的 Ehcache 大小