Hibernate mécanisme de pagination
Je suis en train d'utiliser Hibernate pagination pour ma requête (PostgreSQL )
j'ai mis setFirstResult(0), setMaxResults(20) pour ma requête sql. Mon code comme ci-dessous:
Session session = getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("FROM Customers");
query.setFirstResult(0);
query.setMaxResults(20);
List<T> entities = query.list();
session.getTransaction().commit();
mais lors de la visualisation de SQL, hibernate journal, je vois encore plein de requêtes sql:
Hibernate: select customer0_.id as id9_, customer0_.customer_name as dst2_9_, customer0_.addres as dst3_9_ from tbl_customers customer0_
Pourquoi il n'y a pas de LIMITE de DÉCALAGE dans la requête Hibernate de la pagination du journal SQL?
Personne ne sait à propos de Hibernate mécanisme de pagination?
Je suppose que Hibernate, sélectionnez toutes les données, mettre les données dans le jeu de résultats, puis pagination dans le jeu de résultats, non?
Nan Hibernate ne pas le faire et il essaie d'appliquer la pagination dans la requête de niveau. Je crois que c'est un dialecte problème, êtes-vous sûr que vous avez défini Postgre dialecte dans Hibernate config?
Par la manière, est-ce SQL ou HQL? Vous devez passer un HQL à
Dans cet exemple, j'utilise: mise en veille prolongée Exemples de Requêtes (HQL)
Par la manière, est-ce SQL ou HQL? Vous devez passer un HQL à
createQuery
méthode.Dans cet exemple, j'utilise: mise en veille prolongée Exemples de Requêtes (HQL)
OriginalL'auteur MartinJoo | 2013-10-29
Vous devez vous connecter pour publier un commentaire.
Je suis à l'aide des requêtes et d'en veille prolongée de retour d'appel. les deux fonctionnent comme prévu. Hibernate Requête s'exécute sur les résultats entre la Première et la taille maximale donnée. Ici Semble que vous avez passé SQL pas à la requête HQL. si oui, il ne devrait pas fonctionner.
-- Voir mon code ici.
et dans le journal:
sélectionnez
*
à partir de
( sélectionnez
-- TOUS les noms de colonne. (ne veulent pas les partager ici.)
à partir de
MY_TBL_NAME querytype0_ )
où
rownum <= ?
OriginalL'auteur CHowdappaM
Il y a assez peu de moyens pour paginer.
HQL et setFirstResult, setMaxResults API
HQL et la ScrollableResults API
Simplement l'API criteria
baeldung les listes avec des exemples.
SGBDR dépendante et pas tous les SGBDR a ce problème. Bon à savoir, mais ce n'était pas l'affiche originale de la question ou du problème
OriginalL'auteur Anand Rockzz
Comme je l'ai expliqué dans cet article, vous pouvez utiliser l'APP de la pagination pour les deux entité et de requêtes de SQL natif.
À la limite de la requête sous-jacente
ResultSet
taille, la JPAQuery
interface permet à l'setMaxResults
méthode.La navigation de la page suivante nécessite le positionnement de l'ensemble de résultats où la dernière page terminée. À cette fin, la JPA
Query
interface permet à l'setFirstResult
méthode.JPQL
DTO projection des requêtes
La JPA requête de la pagination n'est pas limitée à l'entité requêtes qui retournent des entités. Vous pouvez l'utiliser pour DTO projections.
Natif SQL les requêtes
La JPA requête de la pagination n'est pas limitée aux requêtes d'entités, telles que JPQL ou les Critères de l'API. Vous pouvez l'utiliser pour les requêtes SQL.
JOIN FETCH et la pagination
Cependant, si nous essayons d'utiliser les
JOIN FETCH
clause dans l'entité de la requête tout en utilisant JPA pagination:Hibernate va émettre le message d'avertissement suivant:
Et exécution de la requête SQL, il manque la pagination de la clause:
C'est parce que Hibernate veut récupérer des entités entièrement avec leurs collections, comme indiqué par la
JOIN FETCH
clause tandis que le SQL au niveau de la pagination peut tronquer leResultSet
laissant peut-être un parentPost
entité, avec moins d'éléments dans lecomments
collection.Le problème avec le
HHH000104
avertissement est qu'Hibernate va chercher le produit dePost
etPostComment
entités, et en raison du résultat de la taille de l'ensemble, le temps de réponse est importante.Afin de contourner cette limitation, vous devez utiliser un Fonction Fenêtre requête:
OriginalL'auteur Vlad Mihalcea