Comment récupérer toutes les données dans une requête
J'ai plusieurs entités qui sont interrogés par JPA2 Critères de Requête.
Je suis en mesure de joindre au moins deux de ces entités et d'obtenir le résultat à la fois:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<LadungRgvorschlag> criteriaQuery = criteriaBuilder.createQuery(LadungRgvorschlag.class);
Root<LadungRgvorschlag> from = criteriaQuery.from(LadungRgvorschlag.class);
Join<Object, Object> ladung = from.join("ladung");
from.fetch("ladung", JoinType.INNER);
Alors j'essaie de joindre une table supplémentaire comme ça:
ladung.join("ladBerechnet");
ladung.fetch("ladBerechnet", JoinType.LEFT);
j'obtiens l'erreur suivante:
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=generatedAlias3,role=null,tableName=ladberechnet,tableAlias=ladberechn3_,origin=ladungen ladung1_,columns={ladung1_.id ,className=de.schuechen.beans.tms.master.LadBerechnet}}] [select generatedAlias0 from de.schuechen.beans.tms.master.LadungRgvorschlag as generatedAlias0 inner join generatedAlias0.ladung as generatedAlias1 inner join generatedAlias1.ladBerechnet as generatedAlias2 left join fetch generatedAlias1.ladBerechnet as generatedAlias3 inner join fetch generatedAlias0.ladung as generatedAlias4 where ( generatedAlias0.erledigt is null ) and ( generatedAlias0.belegart in (:param0, :param1) ) and ( generatedAlias1.fzadresse in (:param2, :param3) ) and ( generatedAlias1.zudatum<=:param4 ) and ( 1=1 ) order by generatedAlias0.belegart asc, generatedAlias1.fzadresse asc, generatedAlias1.zudatum asc, generatedAlias1.zulkw asc]
Comment puis-je savoir JPA/Hibernate, il faut sélectionner toutes les entités à la fois?
source d'informationauteur Stinnux
Vous devez vous connecter pour publier un commentaire.
Avec
APP'certains dialectes de la JPA" vous pouvez la chaîne de rejoindre extrait, mais je ne pense pas que vous pouvez/devez faire à la fois un joint et un join fetch.Par exemple, si nous avons un
Program
qui a un un-à-plusieurs rapport à unReward
qui a un rapport à unDuration
la suite JPQL, serait d'obtenir une instance spécifique avec les récompenses et la durée de pré-extraites:Avec les Critères équivalents code:
Noter que les variables intermédiaires de récompense et la durée ne sont pas nécessaires, mais ils sont juste à titre informatif.
root.fetch("rewards", JoinType.LEFT).fetch("duration", JoinType.LEFT)
aurait le même effet.Ce qu'il vient de JPA, vous ne pouvez pas la chaîne de rejoindre les extractions dans les Critères de requêtes API (citation de la spécification):
Et il n'est également pas pris en charge dans les requêtes JPQL:
Avec HQL il semble être possible: Documentation Hibernate EclipseLink ne fournit pas une telle extension, de sorte que la syntaxe de la requête suivante est acceptée par Hibernate, mais pas par EclipseLink:
Dans EclipseLink même chose peut être fait via les indicateurs de requête.