인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

@Todo님의 프로필 이미지
@Todo

작성한 질문수

실전! Querydsl

조인 - 페치 조인

@QueryProjection과 fetch join

작성

·

7.8K

7

List<ProjectionResult> fetch = queryFactory
.select(new QProjectionResult(classA.id,
classA.relStatus.stringValue(),
classA.relResult.stringValue(),
classA.name,
))
.from(classA)
.join(classA.classB, classB).fetchJoin()
.join(classB.classC, classC).fetchJoin()

안녕하세요. 

위와 같이 join fecth와 queryprojection을 같이 사용하는 예제에서 실행하면 

Caused by: 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,

와 같은 예외를 발생시킵니다. 

select(new QProjectionResult)가 아닌 select(classA)를 하면 정상적으로 결과가 처리되는데

어떤 차이가 있고 어떻게 해결을 해야 할까요 ?

감사합니다. 

답변 1

18

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요^^

fetch join을 사용하는 이유는 엔티티 상태에서 엔티티 그래프를 참조하기 위해서 사용하는 것입니다. 따라서 당연히 엔티티가 아닌 DTO 상태로 조회하는 것은 불가능합니다.

이 경우 fetch join을 사용하지 마시고, 그냥 순수한 join을 사용하시면 원하는 결과를 얻을 수 있습니다^^

참고로 관련된 부분을 활용2편에서 DTO를 조회할 때 자세히 설명해드리니 참고해주세요 :)

@Todo님의 프로필 이미지
@Todo

작성한 질문수

질문하기