jpa에서 DTO로 직접조회 , 플릿데이터 최적화
@GetMapping("/api/v6/orders")
public List<orderQueryDto> ordersV6(){
List<orderFlatDto> flats = orderQueryRepository.findAllByDto_flat();
return flats.stream()
.collect(groupBy(o -> new orderQueryDto(o.getOrderId(), o.getItem(),o.getOrderDate(),o.getOrderStatus(),o.getAddress()),
Mapping( o -> new OrderItemQueryDto(o.getOrderId() , o.getItemName(), o.getOrderPrice(), o.getCount().toList()))
)).entrySet().stream()
.map( e -> new OrderQueryDto(e.getKey().getOrderId() , e.getKey().getName(),
e.getKey.getOrderDate(),e.getKey().getOrderStatus(),
e.getKey().getAddress(),e.getValue()))
collection(toList());
}
DB에서 Order, OrderItem , Item 을 한번에 받아와서
Container에서 분해해서 중복을 제거하고 재조립한다.
쿼리가 1번만 나가서 n+1문제는해결
일단 쿼리에 join되기 떄문에 데이터 뻥튀기가 된다.
애플리케이션에 추가작업이 생긴다.
결정적으로 페이징이 불가능하다.
order , orderItems , Item 모두 join해서 쿼리하번으로 값 가져오기
public List<orderFlatDto> findAllByDto_flat(){
return em.createQuery(
"select new jpabook~orderflatDto(o.id , m.name , o.orderDate , o.status , d.address , i.mane , oi.orderPrice , oi.count)" +
"from Order o" +
"join o.member m" +
"join o.delivery d" +
"join o.orderItems o" +
"join oi.item i " , orderflatDto.class
).getResultList()
}
모든 Collection 필드를 join해서 데이터가 뻥튀기 된다.
페이징이 먹기는 하나 뻥튀기된 데이터 기준으로 된다.
Controller에서 추가적인 작업이 필요하다.
'JPA' 카테고리의 다른 글
| 3월 7일 JPA OSIV 와 성능최적화 (0) | 2023.03.07 |
|---|---|
| 3월 6일 JPA API 개발 고급 정리 (0) | 2023.03.06 |
| 3월 6일 JPA 주문조회 V5 (0) | 2023.03.06 |
| 3월 3일 JPA 주문조회 v4 (0) | 2023.03.03 |
| 2월 27일 주문조회 V3.1 (0) | 2023.02.27 |