code

쿼리가 조인 가져 오기를 지정했지만 가져온 연결의 소유자가 선택 목록에 없습니다.

codestyles 2020. 12. 1. 08:03
반응형

쿼리가 조인 가져 오기를 지정했지만 가져온 연결의 소유자가 선택 목록에 없습니다.


두 개의 ID 열을 선택했지만 오류가 지정되었습니다.

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]

일부 코드 :

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";

오류를 수정하는 방법과 내가 뭘 잘못하고 있니?


join대신 일반 사용하십시오 join fetch( inner기본적으로) :

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " + 
        " join ec.revision as r " + ...

오류 메시지에서 알 수 있듯이 join fetch, 컬렉션을 강제로로드하는 성능 힌트이므로 여기서는 의미가 없습니다.


조인 가져 오기가 필요하므로 가져 오기를 제거하면 요구 사항을 충족 할 수 없습니다.

대신해야 할 일은 카운트 쿼리를 함께 지정하는 것입니다.

결과를 페이지로 나누고 있다고 가정하면 아래는 id를 매개 변수로 사용하고 지정한 문제를 일으키는 jpa 쿼리이며 두 번째 쿼리는 count 쿼리를 추가하여이 문제를 해결합니다.

참고 : fk_field은 일대 다 rln이있는 tableA의 속성입니다. 개수 쿼리는 조인 가져 오기를 사용하지 않습니다.

@Query(value = "from TableA a LEFT JOIN FETCH a.fk_field where a.id = :id") 

@Query(value = "from TableA a LEFT JOIN FETCH a.fk_field where a.id = :id", 
  countQuery = " select  count(a) from TableA a left join a.fk_field where a.id = :id")

참고 URL : https://stackoverflow.com/questions/12459779/query-specified-join-fetching-but-the-owner-of-the-fetched-association-was-not

반응형