• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

계층구조로 join이 일어나는 경우에 대한 질문입니다..

23.06.07 13:21 작성 조회수 201

0

@Table(name = "a")
@Entity
@Getter
public class AEntity {
    @Id
    @Column(name = "a_id")
    private Long aId;

    @OneToMany(mappedBy = "aEntity")
    List<BEntity> bList;

    public void initializeClist() {
        bList.stream().map(BEntity::getCList).forEach(Hibernate::initialize);
    }
}
@Table(name = "b")
@Entity
@Getter
public class BEntity {
    @Id
    @Column(name = "b_id")
    private Long bId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private AEntity aEntity;

    @OneToMany(mappedBy = "bEntity")
    List<CEntity> cList;   
}
@Table(name = "c")
@Entity
@Getter
public class CEntity {
    @Id
    @Column(name = "c_id")
    private Long cId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "b_id")
    private BEntity bEntity;
}

안녕하세요. 수업을 아직 수강중인 학생입니다.

위와같이 A -> B -> C 아래로 OneToMany 관계로 LeftJoin을 해야한다고 하면

어떤식으로 코드를 짜야하는 걸까요?

displayRwdbJpaQueryFactory
    .selectFrom(QAEntity.aEntity)
    .leftJoin(QAEntity.aEntity.bList, QBEntity.bEntity)
    .fetchJoin().fetch();

.fetchJoin을 써봤는데.. 한번은 되는데 두번은 안되더라구요..

bList.stream().map(BEntity::getCList).forEach(Hibernate::initialize);

@BatchSize 주고 위처럼 initialize 해봤는데..

테이블 계층구조가 여기서 끝나는게 아니라서.. 이런식으로 처리 되기에는 조금 무리가 있을것 같습니다.

장고끝에 조언을 구합니다.. 도와주세요.. ㅠㅠ

답변 1

답변을 작성해보세요.

1

안녕하세요. 디카페인빌런님

이 문제를 해결하는 다양한 방법들이 있는데요.

결론부터 말씀드리면 fetch join은 하나만 적용할 수 있습니다.

그리고 나머지는 batch size, 또는 dto로 조회후 조립하는 방법등을 사용해야 합니다.

관련해서 다음 강의에서 해당 내용을 자세히 다루니 강의 내용을 참고해주세요.

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

감사합니다.