Printemps-EXTRACTION de Données de JOINTURE avec la Pagination ne fonctionne pas
Je suis en train d'utiliser les requêtes HQL aller chercher de mon entité avec sous-entités à l'aide de JOIN FETCH, cela fonctionne bien si je veux tous les résultats, mais il n'est pas le cas, si je veux une Page
Mon entité est
@Entity
@Data
public class VisitEntity {
@Id
@Audited
private long id;
.
.
.
@OneToMany(cascade = CascadeType.ALL,)
private List<VisitCommentEntity> comments;
}
et parce que j'ai des millions de visites, j'ai besoin d'utiliser Paginable et je veux Extraire les commentaires en une seule requête de base de données comme :
@Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ..." )
public Page<VisitEntity> getVenueVisits(@Param("venueId") long venueId,...,
Pageable pageable);
Que HQL appel jette l'exception suivante:
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=com.ro.lib.visit.entity.VisitEntity.comments,tableName=visitdb.visit_comment,tableAlias=comments1_,origin=visitdb.visit visitentit0_,columns={visitentit0_.visit_id ,className=com.ro.lib.visit.entity.VisitCommentEntity}}] [select count(v) FROM com.ro.lib.visit.entity.VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and (v.actualArrival > :date or v.arrival > :date)]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:309)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
et une fois que j'ai supprimer la pagination tout fonctionne bien
@Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ..." )
public List<VisitEntity> getVenueVisits(@Param("venueId") long venueId,...);
Évidemment, le problème est le nombre de requêtes à partir du Printemps-Données, mais comment pouvons-nous résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple est d'utiliser le
countQuery
de l'attribut de la@Query
annotation de fournir une requête personnalisée à être utilisé.countQuery = "select count(v) from VisitEntity v where …")
countQuery
, ne pas oublier d'enleverFETCH
. il ne devrait pas êtreFETCH
dans lecountQuery
.Alternativement dans des versions plus récentes de Printemps (soutien à la JPA 2.1 spécification), vous pouvez utiliser de l'entité graphique comme ceci:
De cours de l'entité nommée graphiques fonctionnent aussi bien.
Vous devez spécifier
countQuery
param pour@Query
et maintenant vous pouvez utiliserPage
ouList
comme valeur de retour.v.comments
) pour lacountQuery
? Ou serait la suivante suffit"SELECT count(v) FROM VisitEntity v WHERE v.venue.id = :venueId and ..."
?