Hibernate - HQL la pagination

C'est un problème similaire à: HQL - identificateur de ligne pour la pagination

Je suis en train de mettre en œuvre la pagination à l'aide de requêtes HQL. J'ai une base de données 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 );

Ce qui se passe est que Hibernate récupère TOUS les Messages, et renvoie le nécessaire après, ils étaient tous chargés.

Ainsi, Hibernate extrait de 210000 entités au lieu des 30 qui sont retournés chacun des Messages a exactement 2 commandes).

Est-il un moyen de réduire les coûts par un facteur de 7000?

edit: j'ai essaye en ajoutant .setFetchSize( elementsPerBlock ) . Il n'a pas aidé.

edit 2: la requête SQL générée est:

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

Absolutenly pas de LIMITER ou de COMPENSER

  • que peut-être un bug. pouvez-vous activer le débogage paramètre pour afficher les requêtes SQL et de voir le réel de la requête exécutée s'il vous plaît?
  • la requête SQL n'a absolument aucune LIMITE ou OFFSET
  • setFirstResult( elementsPerBlock * (à la page-1) +1 ) ) "-1 +1" ne semble pas être correct ici :o)
InformationsquelleAutor iliaden | 2011-06-14