QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
문제 상황
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을 해주면 해결된다.
댓글남기기