jan*_*oth 7 sql-server orm hibernate jpa sql-server-2008
我使用hibernate/JPA 实现服务器端数据分页,底层数据库是MS SQL Server 2008.
SQL生成如下:
criteria.setFirstResult(pagingParams.getDisplayStart())
.setMaxResults(pagingParams.getDisplayLength());
Run Code Online (Sandbox Code Playgroud)
(主要工作在于创建适当的过滤器/排序,但这与此无关)
我正在观察的是以下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_,...
Run Code Online (Sandbox Code Playgroud)
... 等等.
显然,如果底层结果集太大而且(b)与分页没什么关系,那么(a)将遇到严重问题:-(
谁有同样的问题?
更新:似乎NHibernate(Hibernate的.NET实现)利用Row_Number()了T-SQL 的功能.可惜Hibernate没有...
稍微迟到的回复,但它可能会有所帮助,所以我会发布它.有完全相同的问题和头痛来追踪它.解决方案是使用org.hibernate.dialect.SQLServer2012DialectHibernate 4.3.0中包含的内容.生成的查询变为(粘贴没有列名和别名的真正的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__ < ?
Run Code Online (Sandbox Code Playgroud)
注意内部查询和Row_number()函数的用法.他们终于解决了!
| 归档时间: |
|
| 查看次数: |
5907 次 |
| 最近记录: |