【发布时间】:2011-09-14 22:38:57
【问题描述】:
这是一个类似的问题:HQL - row identifier for pagination
我正在尝试使用 HQL 实现分页。我有一个 PostgreSQL 数据库。
int elementsPerBlock = 10;
int page = 2; //offset = 2*10
String sqlQuery = "FROM Messages AS msg " +
" LEFT JOIN FETCH msg.commands AS cmd " +
"ORDER BY msg.identifier ASC" ;
Query query = session.createQuery( sqlQuery )
.setFirstResult( elementsPerBlock * ( (page-1) +1 ) )
.setMaxResults( elementsPerBlock );
发生的情况是 Hibernate 获取所有消息,并在它们全部加载后返回所需的消息。
因此,Hibernate 获取 210000 个实体,而不是返回的 30 个(每个消息恰好有 2 个命令)。
有没有办法将开销减少 7000 倍?
编辑:我尝试添加 .setFetchSize( elementsPerBlock ) 。它没有帮助。
编辑2:生成的SQL查询是:
select ...
from schemaName.messages messages0_
left outer join schemaName.send_commands commands1_
on messages0_.unique_key=commands1_.message_key
order by messages0_.unique_identifier ASC
绝对没有限制或偏移
【问题讨论】:
-
这可能是一个错误。能否启用调试参数以显示 SQL 查询并查看实际执行的查询?
-
SQL 查询绝对没有 LIMIT 或 OFFSET
-
setFirstResult( elementsPerBlock * ( (page-1) +1 ) ) 这里的“-1 +1”似乎不正确 :o)
标签: hibernate pagination hql