OneToMany Many쪽의 페이지네이션 질문입니다
860
작성한 질문수 8
안녕하세요? 섹션 4 강의 컬렉션 조회 페이징을 보고 질문 드립니다. 주문 조회 V3.1에서 페이징을 위해
jpa.properties.hibernate.default_batch_fetch_size=100, @BatchSize를 사용하거나 또는
V5에서 Map, groupBy를 이용하여 DTO 직접 조회Order에 대하여 페이징이 가능하다는 것을 알았습니다.
그런데 만약 Order 페이징 + OrderItem 페이징(예를 들어 주문을 10건 중 비싼 아이템 2건만 조회하기)같은 경우에는 어떻게 적용이 가능한가요?
public List<OrderQueryDto> findAllOpt(){
List<OrderQueryDto> result = findOrders(); // 기존의 ToOne 쿼리
List<Long> orderIds = result.stream() // in 쿼리를 위한 id 뽑기
.map(o -> o.getOrderId())
.collect(Collectors.toList());
List<OrderItemQueryDto> orderItems = findMap(orderIds);
Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream()
.collect(Collectors.groupingBy(OrderItemQueryDto::getOrderId));
result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId())));
return result;
}
public List<OrderItemQueryDto> findMap(List<Long> orderIds) {
return em.createQuery(
"select new queryDto(파라미터들)" +
" from OrderItem oi" +
" join oi.item i" +
" where oi.order.id in :orderIds", OrderItemQueryDto.class)
.setFirstResult(0)
.setMaxResults(2)
.setParameter("orderIds", orderIds)
.getResultList();
)
}
이렇게 Limit를 걸었을 때 UserA 2건 뜨고 UserB는 null 이 뜨더군요.
다른 방법을 찾아본 결과 https://bottom-to-top.tistory.com/45 처럼 방향을 반대로 하여 ManyToOne으로 조회하는 방법도 있다는것을 알았습니다.
결국엔 Order 페이징 + OrderItem 페이징 까지 접목시키려면 ManyToOne으로 조회하는 방법밖에 없을까요?
답변 2
1
안녕하세요. Sunny님
이 부분은 JPA의 문제라기 보다는 관계형 데이터베이스의 한계입니다. OneToMany 관계를 조인하면 데이터가 증가해서 정확한 페이징이 불가능합니다.
반대로 ManyToOne 관계를 조인하면 데이터수가 증가하지 않기 때문에 정확한 페이징이 가능합니다.
감사합니다.
강의 관련 외 질문입니다.
0
62
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
85
1
BeanCreationException
0
86
3
Update 후 UpdateMemberResponse 매핑할 때
0
46
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
96
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
81
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
61
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
108
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
83
2
fetch join과 영속화와 OSIV의 관계
0
83
2
Distinct 사용 전 결과에 대한 의문
0
112
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
55
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
77
2
dto 필드 속 엔티티 여부
0
58
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
85
1
DTO 대신 Form 사용은 안되나요?
0
133
1
OSIV ON 상태일 때
0
94
1
fetch join VS fetch join 페이징 궁금증
0
178
2
양방향 연관관계 알아보는 법?
0
102
1
16강 17강 간단 정리 이게 맞을까요 ?
0
161
2





