본문 바로가기

JPA

3월 6일 JPA 주문조회 V6

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