최대 1 분 소요

문제 상황

Querydsl을 사용해서 쿼리를 작성했고 select절에서 바로 DTO로 뽑을 수 있도록 하고 싶었다.
그래서 해당 DTO class 생성자에 @QueryProjection을 걸어줬고, 이 DTO에 들어가는 값들은 여러 엔티티를 참조해서 얻은 값
이었기 때문에 join이 필요했다. 예를 들자면 다음 코드를 참조하자.

queryFactory
.select(QDtoClass(user.age, friend.age))
.from(user)
.leftJoin(user.friend, friend)
.fetch()

여기서 friend 엔티티의 필드를 참조하려면 fetch join이 필요하다고 생각했고, fetchJoin()을 걸어줬다.

.leftJoin(user.friend, friend).fetchJoin()

그리고 다음 에러가 발생했다.

QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list

해결 방법

쿼리의 결과를 엔티티로 내보내주는 케이스라면 이후 그 응답을 활용해서 연관된 엔티티 정보를 자유롭게 참조할 수 있도록 fetch join
을 해주는게 맞다. 하지만 위 쿼리에서는 DTO를 내보내주고 있고, DTO 상태로 타 엔티티 참조는 불가능하므로 용도에 맞지 않다.

따라서 이런 경우 fetch join이 아니라 join을 해주면 해결된다.

Reference

카테고리:

업데이트:

댓글남기기