JPA

[JPA] OneToMany join 데이터 중복 조회 문제

Yerim Kim 2022. 1. 12. 10:29

문제상황

1.

예제 테이블 구조

 

2.

select * from team join member on team.id = member.id;

 

3.

JPQL select t from Team t join fetch t.members

 

실행된 쿼리 (요약)

select * 
    from Team team
    inner join Member members
    on team.id=members.team_id

조회 결과 (List<Team>)

team{id=1, name=청팀, 멤버:{id=1, name=김예림},{id=2, name=홍금비}}
team{id=1, name=청팀, 멤버:{id=1, name=김예림},{id=2, name=홍금비}}
team{id=2, name=홍팀, 멤버:{id=3, name=이종성},{id=4, name=백승연}}
team{id=2, name=홍팀, 멤버:{id=3, name=이종성},{id=4, name=백승연}}
team{id=3, name=백팀, 멤버:{id=5, name=이하빈},{id=6, name=오혜령}}
team{id=3, name=백팀, 멤버:{id=5, name=이하빈},{id=6, name=오혜령}}
team{id=4, name=흑팀, 멤버:{id=7, name=최진영},{id=8, name=진완선}}
team{id=4, name=흑팀, 멤버:{id=7, name=최진영},{id=8, name=진완선}}

 

JPQL 사용시, 2번에서와 쿼리는 똑같이 나갔음에도 조회 결과는 뻥튀기되었음.

 

이 문제는 OneToMany  join & fetch join 에서만 발생한다.

 

distinct를 이용하여 해결한다.

select distinct t from Team t join fetch t.members

 

실행된 쿼리 (요약)

select distinct * 
    from Team team
    inner join Member members
    on team.id=members.team_id

조회 결과 (List<Team>)

team{id=1, name=청팀, 멤버:{id=1, name=김예림}, {id=2, name=홍금비}}
team{id=2, name=홍팀, 멤버:{id=3, name=이종성}, {id=4, name=백승연}}
team{id=3, name=백팀, 멤버:{id=5, name=이하빈}, {id=6, name=오혜령}}
team{id=4, name=흑팀, 멤버:{id=7, name=최진영}, {id=8, name=진완선}}

 

이러면 실제 쿼리에도 distinct가 붙는데 얘는 딱히 의미는 없고

쿼리 실행 이후에 JPA에서 뻥튀기되지 않는 효과가 있다.