Hibernate - разбивка на страницы HQL

Это проблема, похожая на: 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) . Это не помогло.

правка 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

19
задан Community 23 May 2017 в 12:25
поделиться