두 개의 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")