gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:08:21 34 4
gpt4 key购买 nike

我用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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com