JPA 컬렉션 패치 조인의 문제점

최대 1 분 소요

JPA에서 컬렉션 패치 조인을 하는 경우 리스트가 중복되어 나오는 문제가 있다.
아래의 예시를 보자.

JPQL distinct

@Test
void fetchJoinByTeam() {
    //given

    //when
    List<Team> result = queryFactory
        .selectFrom(team)
        .join(team.members, member).fetchJoin()
        .fetch();

    //then
    for (Team team : result) {
        System.out.println("team = " + team);
        for (Member member : team.getMembers()) {
            System.out.println("member = " + member);
        }
    }
}

1

  • 1:N의 관계를 조회하는 경우 row수는 당연히 증가되어 있기 때문에 이 문제는 어찌보면 당연한 결과이다.
  • teamA와 teamB에 각각 두명의 member가 맵핑되어 있기 때문에 총 4개의 row가 리턴되었다.
  • JPQL은 총 4개의 결과물을 team 엔티티 기준으로 저장할 것이기에 중복된 결과가 만들어지는 것이다.
  • 따라서 1:N 패치조인을 할 경우 distinct를 필수적으로 해주어야 한다.
@Test
    void fetchJoinByTeamDistinct() {
        //given

        //when
        List<Team> result = queryFactory
            .selectFrom(team).distinct()
            .join(team.members, member).fetchJoin()
            .fetch();

        //then
        for (Team team : result) {
            System.out.println("team = " + team);
            for (Member member : team.getMembers()) {
                System.out.println("member = " + member);
            }
        }
    }

1

태그:

카테고리:

업데이트:

댓글남기기