//==fetch join시에 XtoMany에서 List Collections들과 join시에 중복 데이터 삭제하는법 ==//
ex) Order를 불러올 때, orderItems도 join해서 부르면 orderItems의 개수만큼 중복 Order가 불려온다.
Order에 연결된 orderItems 개수만큼 중복된 모습
fetch join 나쁜 예
public List<Order> findAllWithItem(OrderSearch orderSearch) {
return em.createQuery("select o from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d" +
" join fetch o.orderItems oi" +
" join fetch oi.item i", Order.class).getResultList();
}
여기서 JPA의 distinct를 적용하면, 동일한 id인 order 객체는 제거하여 준다. (4개 찾아올거 2개 찾아옴)
JPA에 distinct를 적용하여 order id당 한개씩만 가져온 모습
기존 JPQL에 distinct만 추가해주었다. db의 distinct와 다른 점은 db값이 모두 동일하지 않아도, Order 객체의 id값이 동알히면 배제한다.
public List<Order> findAllWithItemDistinct(OrderSearch orderSearch) {
return em.createQuery("select distinct o from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d" +
" join fetch o.orderItems oi" +
" join fetch oi.item i", Order.class).getResultList();
}
'스프링 > JPA' 카테고리의 다른 글
[JPA 기초] API 사용시 DTO로 변환하는 이유 + 주의사항 (DTO 내부에 Entity객체가 없어야 한다) (0) | 2022.04.05 |
---|---|
[JPA 기초] OSIV (Transaction 생존 범위에 따른 성능, 대처에 대해) (0) | 2022.04.05 |
[JPA 기초] JPA에서 기존 엔티티의 값을 수정하는 방법 (부제 : 왜 em.merge() 사용을 지양해야하는가) (0) | 2022.04.05 |
[JPA 기초] 기본 Entity 설정시 사용되는 annotation 정리 (0) | 2022.04.05 |
Query By Example 간단 예제, 사용 (0) | 2022.03.01 |