这是一个类似于以下问题的问题: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
完全没有LIMIT或OFFSET限制