작성
·
36
·
수정됨
1
OneToMany 관계에서 페치조인을 하게되면 페이징이 불가하다고 하셨는데
OneToMany는 batchSize를 조절하여 해결한뒤
OneToMany안의 ManyToOne 관계는 어떻게 페치조인 할수있을까요?
예를 들어서
테이블 A, B, C가 있을경우
A와 B는 OneToMany관계
B와 C는 ManyToOne관계
class A {
@OneToMany
private List<B> b = new ArrayList<>();
}
class B {
@ManyToOne // Lazy
private A a;
@ManyToOne // Lazy
private C c;
}
class C {
}
A를 조회하고 C까지 끌고와야하는경우
A와 B는 OneToMany 관계이기 때문에 페치조인이 불가능하지만
B와 C는 페치조인이 가능하다고 이해하였습니다
BatchSize를 설정하여 A에서 B를 가져올시 IN 쿼리로 가져온뒤
B에서 C를 페치 조인하는 방법은 없나요?
아니면 이런경우 특수하게 B에서 C를 Eager로 설정 해야할까요
애초에 B를 통해서 A와 C를 가져와야할까요
답변 1
1
안녕하세요. h0ch1님
페이징이 필요한 경우 이 문제를 해결할 수 있는 방법은 크게 2가지가 있습니다.
실전 스프링 부트와 JPA 활용 2편을 모두 들었다고 가정하고 답변을 드리겠습니다.
첫 번째 BatchSize를 활용하는 방법
이 경우 A를 조회하고, B를 한번에 조회하고, C를 한번에 조회하게 됩니다. 결과적으로 1 + 1 + 1의 쿼리가 발생합니다.
두 번째 DTO로 조회하는 방법
A를 DTO로 조회한 다음에 A의 아이디를 기반으로 필요한 B와 C를 조인해서 한번에 조회합니다. 그리고 필요한 내용을 조립합니다. 이 경우 1(A) + 1(B + C)의 쿼리가 실행됩니다.
감사합니다.