이번에 프로젝트에서 아래와 같은 에러를 경험하게 되었습니다.
Caused by: org.hibernate.QueryException:
query specified join fetching, but the owner of the fetched association was not present in the select list
이 에러가 발생한 원인과 해결 방법을 정리해보았습니다.
- 원인
fetchJoin
은 엔티티(Entity) 간의 관계를 가져올 때 사용되는 Hibernate의 기능입니다. 이는 엔티티의 엔티티 그래프를 함께 로딩하여 성능을 최적화하는데 유용하지만, VO(Value Object) 같은 단순한 값 객체에서는 사용될 수 없습니다.
문제가 발생한 이유는, Projection을 사용하여 VO를 반환하는 쿼리에서 fetchJoin을 사용했기 때문입니다. VO는 엔티티가 아니기 때문에 fetchJoin이 제대로 동작하지 않으며, 이로 인해 쿼리 실행 중 오류가 발생한 것입니다.
- 해결 방법
VO를 반환하는 구조에서는 엔티티 간의 fetchJoin
을 사용할 필요가 없으므로, 해당 쿼리에서 fetchJoin
을 제거해야 합니다. 엔티티 간의 관계를 미리 로딩할 필요가 없고, 필요한 필드를 명시적으로 선택하는 방식으로 쿼리를 작성하면 됩니다.
따라서, Projection을 사용할 때는 엔티티 간의 관계를 로딩하는 방식이 아닌, 필요한 필드만 선택하는 방식으로 쿼리를 작성해야 에러를 방지할 수 있습니다.