jpashop : 컬렉션 조회 v5 (jpa - dto 직접조회 최적화)
This commit is contained in:
@@ -63,4 +63,9 @@ public class OrderApiController {
|
||||
public List<OrderQueryDto> ordersV4() {
|
||||
return orderQueryRepository.findOrderQueryDtos();
|
||||
}
|
||||
|
||||
@GetMapping("/api/v5/orders")
|
||||
public List<OrderQueryDto> ordersV5() {
|
||||
return orderQueryRepository.findAllByDto_optimization();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Repository
|
||||
@RequiredArgsConstructor
|
||||
@@ -22,6 +24,36 @@ public class OrderQueryRepository {
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<OrderQueryDto> findAllByDto_optimization() {
|
||||
List<OrderQueryDto> result = findOrders();
|
||||
List<Long> orderIds = toOrderIds(result);
|
||||
|
||||
Map<Long, List<OrderItemQueryDto>> orderItemMap = findOrderItemMap(orderIds);
|
||||
|
||||
result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId())));
|
||||
return result;
|
||||
}
|
||||
|
||||
private Map<Long, List<OrderItemQueryDto>> findOrderItemMap(List<Long> orderIds) {
|
||||
List<OrderItemQueryDto> orderItems = em.createQuery(
|
||||
"select new com.example.jpashop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" +
|
||||
" from OrderItem oi" +
|
||||
" join oi.item i" +
|
||||
" where oi.order.id in :orderIds", OrderItemQueryDto.class)
|
||||
.setParameter("orderIds", orderIds)
|
||||
.getResultList();
|
||||
|
||||
Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream()
|
||||
.collect(Collectors.groupingBy(OrderItemQueryDto::getOrderId));
|
||||
return orderItemMap;
|
||||
}
|
||||
|
||||
private List<Long> toOrderIds(List<OrderQueryDto> result) {
|
||||
return result.stream()
|
||||
.map(OrderQueryDto::getOrderId)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<OrderItemQueryDto> findOrderItems(Long orderId) {
|
||||
return em.createQuery(
|
||||
"select new com.example.jpashop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" +
|
||||
|
||||
Reference in New Issue
Block a user