la requête spécifiée chargement par jointure ouverte, mais le propriétaire de l'extraites de l'association n'était pas présent dans la liste de sélection
Je suis la sélection de deux colonnes id, mais d'erreur spécifié:
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=r,role=null,tableName=REVISIONS,tableAlias=revision1_,origin=ENTITY_CHANGED_IN_REVISION entitychan0_,columns={entitychan0_.REV_ID ,className=ru.csbi.registry.domain.envers.Revision}}] [ select ec.id as entityChangeId, r.id as revisionId from ru.csbi.registry.domain.envers.EntityChange as ec inner join fetch ec.revision as r where ec.groupEntityId = :groupEntityId and ec.groupName = :groupName and r.timestamp < :entityDateFrom and r.timestamp > :entityDateTo and ( ec.revisionType in (0, 5, 1, 4, 2 ) and not ( ec.otherGroupEntityModified = false and ec.thisGroupEntityModified = true and ec.rowDataModified = false and ec.collectionOfNotGroupEntityModified = false ) ) group by ec.id, r.id having count(*) > :start order by r.id desc]
Code:
String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " +
" inner join fetch ec.revision as r " +
" where ec.groupEntityId = :groupEntityId" +
" and ec.groupName = :groupName " +
" and r.timestamp < :entityDateFrom " +
" and r.timestamp > :entityDateTo " +
" and ( " +
" ec.revisionType in (" +
RevisionType.ADD.getRepresentation() + ", " +
RevisionType.ONLY_DATA_PROPERTY_MOD.getRepresentation() + ", " +
RevisionType.BOTH_COLLECTION_AND_PROPERTY_MOD.getRepresentation() + ", " +
RevisionType.ONLY_COLLECTION_PROPERTY_MOD.getRepresentation() + ", " +
RevisionType.DEL.getRepresentation() +
" ) " +
" and not ( "+
"ec.otherGroupEntityModified = false and " +
"ec.thisGroupEntityModified = true and " +
"ec.rowDataModified = false and " +
"ec.collectionOfNotGroupEntityModified = false " +
" ) " +
" ) " +
" group by ec.id, r.id " +
" having count(*) > :start" +
" order by r.id desc";
La façon de corriger l'erreur et ce que je fais mal?
- pour les futurs chercheurs spécialistes de cette question, dans ma situation, j'ai été rejoindre un non attribut lazy. Quand je l'ai supprimer de rejoindre la clause, il a été résolu.
- Je pense que dans ton cas, le problème est que vous ne sélectionnez pas l'ensemble de l'entité (EntityChange) mais seulement quelques colonnes. Chercher la clause n'a de sens qu', si la racine de l'entité est sélectionnée et que vous voulez un mappé collection / entitiy d'être rempli par le rejoignant.
Vous devez vous connecter pour publier un commentaire.
Utilisation régulière
join
au lieu dejoin fetch
(en passant, c'estinner
par défaut):Comme message d'erreur vous indique,
join fetch
n'a pas de sens ici, car c'est le rendement de l'indice que les forces désireux de chargement de la collecte.join fetch
peut également être utilisé pour forcer le chargement impatient d'une association comme un champ annotée avec @ManyToOne et pas seulement des collections.@Query
annotation, vous pouvez spécifier des requêtes distinctes pour l'extraction et le comte: voir cette question (Printemps-EXTRACTION de Données de JOINTURE avec la Pagination ne fonctionne pas) pour plus de détails.Que vous avez besoin de join fetch, retrait de l'extraction est de ne pas répondre à votre besoin.
Ce que vous devez faire est de spécifier un nombre de requête avec elle.
En supposant que vous paginez le résultat, ci-dessous, jpa requête qui prend l'id comme param et sera la cause du problème que vous avez spécifié et la deuxième requête résout ce problème en ajoutant compter de la requête à elle.
Remarque:
fk_field
est l'attribut dans tableA a la une-à-plusieurs nlr. Le comte requête ne pas utiliser join fetch.