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에서 뻥튀기되지 않는 효과가 있다.