Это проблема, похожая на: HQL - идентификатор строки для разбивки на страницы
Я пытаюсь реализовать разбиение на страницы с помощью 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 раз?
edit: Я пытаюсь добавить .setFetchSize( elementsPerBlock )
. Это не помогло.
edit 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