jpql join

연어는결국강으로·2023년 5월 23일
0

오늘도 jpql을 이용해보았다. 저번에 어떤 유저가 가입한 팀마다 세운 계획 - 목표 리스트를 모두 다 들고 오는 api를 작성했었는데, 좀 무거운거 같아서 계획- 목표리스트로만 들고오고 팀별로 조회를 하도록 재설계를 했다.

그래서 jpa를 새로 짜다가 보니 plan이 들고 있는 목표를 stream으로 돌릴 때마다 db를 조회할거 같았다.(lazy니까) 그래서 이걸 jpql로 작성해봐야겠다고 생각했다.

처음 작성한 jpql은 다음과같다.

@Query("select p from Plan p " +
	"join fetch p.goalList " +
    "where p.member.id = :memberId")
List<Plan> findAllByMemberId(@Param("memberId") Long memberId);

음 쉽군. 하면서 postman으로 테스트를 했다. 어머나 그런데 더미데이터를 3개 넣어놨는데 결과가 0개였다. 뭐지? 재시작도 해보고, 원래는 저기 @Param도 안붙어있었는데 붙여봤다. 뭘해도 안되더라.... 그래서 콘솔에 일일히 다찍어봤다.
member로 찍었는데 잘나왔다. 응? plan으로도 찍었는데 다 잘나왔다. 응? 뭐지? 왜? 버근가? 그럴리는 없는데... 디버깅 모드로 돌렸는데 아 디버깅에서 저 쿼리 나오는걸 잡아주지는 않더라.
거의 한시간 넘게 해매다가 select p from Plan 부터 하나씩 조회해보기로 했다. 잘나왔다. 그런데 join fetch 부분을 넣으니까 하나도 안나왔다. 아!!! 저 쿼리 조회하고 나니까 생각났다. 어쩌면 goalList가 하나도 없어서 안뜨는게 아닐까? 찾아보니 join fetch 는 inner join이라고 한다. 그래서 만약에 goal이 없음에도 계획이 나오게 하고 싶다면 left join인 left join fetch를 사용해야한다고 한다.
결국 아래처럼 수정하고 잘 작동하게되었다. 아.... 내시간... 그럼에도 큰거 배웠다고생각.... 한다... 아오~~~

@Query("select p from Plan p " +
        "left join fetch p.goalList " +
        "where p.member.id = :memberId")
List<Plan> findAllByMemberId(@Param("memberId") Long memberId);

0개의 댓글