작성
·
351
12
안녕하세요. 기본편 수강마치고 강의 듣는 중에 의문점이 있어 질문드립니다.
기본편의 페치조인의 한계 강의에서는 "페치조인의 대상에는 별칭을 줄 수 없다." 고 하셨는데 지금 예제는 별칭을 포함하고 있어서요. (o.member m 과 o.delivery d)
제가 검색조건을 추가해서 테스트해보니 정상적으로 쿼리수행이 되었습니다. 아래는 제가 테스트해본 코드입니다.
public List<Order> findAllWithMemberDelivery(OrderSearch orderSearch) {
return em.createQuery("select o from Order o " +
"join fetch o.member m " +
"join fetch o.delivery d " +
"where (:status is null or o.status = :status) " +
"and (:name is null or m.name like :name)", Order.class)
.setParameter("status", orderSearch.getOrderStatus())
.setParameter("name", orderSearch.getMemberName())
.getResultList();
}
그리고 기본편의 강의에서는 페치조인에 별칭을 주는것의 위험성도 설명해주셨는데요. 지금같이 검색조건을 주는 경우에는 페치조인에 별칭을 줄 수 밖에 없는게 아닌지 궁금합니다.
기본편 강의를 다시 보니 OneToMany 에 대해서만 페치조인 별칭이 위험한 것으로 이해됩니다. 지금예제의 Order와 Member 관계처럼 ManyToOne 에서는 문제가 되지 않는 것인지.. 제가 이해한게 맞는지 확인 부탁드리겠습니다.
답변 2
4
안녕하세요. 헬로월드님^^ 좋은 질문입니다.
질문주신 것 처럼 ManyToOne, OneToOne 관계는 문제가 되지 않습니다^^ 이럴때는 fetch join에 별칭을 쓰면 쉽게 풀어낼 수 있는 상황이 많지요^^
그런데 설명드린 것 처럼 OneToMany에서 Many쪽을 줄이는 방식으로 fetch join을 사용하면, 객체와 데이터베이스 사이에, 데이터 정합성이 안맞기 때문에 문제가 발생할 수 있습니다. 이 부분만 조심하시면 됩니다.
(사실 ManyToOne, OneToOne도 left join으로 페치 조인하고 별칭을 사용해서 join on으로 데이터를 필터링 해버리면 DB에는 데이터가 있는데 객체에 조회한 결과는 오른쪽에 데이터가 없을 수 있어서 문제가 될 수 있습니다.)
결론은 order.getMember()나, member.getOrder()를 호출했을 때 조회된 데이터 수가 데이터베이스에 있는 데이터수와 같으면 문제가 없습니다!
감사합니다.
2