해결된 질문
작성
·
228
4
안녕하세요 영한님 findOrders() 메서드 질문 있습니다!!
앞에서부터 쭉 내용을 봤더니 머릿속이 굉장히 꼬인 것 같네요 ㅎㅎ;
앞서 V3.1 에서 페이징 한계 극복에 사용한 메서드
findAllWithMemberDelivery 는 to One 을 페이징에 영향을 주지않기 때문에 페치조인을 하였습니다.
DTO에 직접 적용하는 V4의 경우 findOrders 메서드를 사용하였는데 이 때에도 to One 을 먼저 조인을 시켰습니다.
여기서 궁금한 점이, 이 때에는 왜 fetch 조인을 사용하지 않은 것인지 궁금합니다. 그리고 어째서 lazy 인데도 불구하고 1건으로 조회가 되는지 궁금합니다.
Select o from Order o 만 하면 lazy이기 때문에 Order만 조회가 되지만 위의 경우는 join 을 해주었기 때문에 delivery와 member가 같이 조회가 되는 건가요? lazy인데 어떻게죠? 만약 그렇다면, findAllWithMemberDelivery() 메서드에서는 굳이 fetch를 왜 시켜준건지도 아리송합니다. 그냥 join해도 toOne 이니깐 row수를 증가시키지않고 딱 되지 않나요 ??
이해했던게 막 꼬이네요 ㅜㅜ
답변 2
6
안녕하세요. kangsy763님^^
fetch join은 객체 그래프를 조회하는 것이기 때문에 엔티티를 select 하는 경우에만 사용할 수 있습니다.
v4 처럼 데이터를 하나씩 찍어서, DTO로 직접 조회하는 경우에는 fetch join을 사용할 수 없습니다.
정리하는데 도움이 되셨길 바래요^^
3
아! 그렇다면 DTO 에 바로 조회하지는 않지만
select m.user name, o.orderDate
from Order o
join fetch o.member m 과 같이 o 그 자체가 아닌 개별로 골라내는 것도 불가능 하다는 거군요! 감사합니다!!