@Test void 사용자를_조회하며_연관된_팀을_함께_조회() { em.flush(); em.clear(); String jpql = "select u from User u join fetch u.team"; em.createQuery(jpql, User.class).getResultList(); }
Hibernate: select u.user_id, u.team_id, u.username, t.teamname from user u inner join team t on u.team_id=t.team_id

사용자가 join으로 땡겨올 연관관계의 범위를 쿼리에서 설정 할 수 있음
컬렉션 페치조인의 뻥튀기
@Test void 팀을조회하는데_users를_페치조인(){ em.flush(); em.clear(); String jpql = "select t from Team t join fetch t.users"; List<Team> resultList = em.createQuery(jpql, Team.class).getResultList(); for (Team team : resultList) { System.out.println("team = " + team.getName() + " teamSize = " + team.getUsers().size()); } }
Hibernate: select t.team_id, t.teamname, u.team_id, u.username, team_id, user_id from team t inner join user u on team0_.team_id=users1_.team_id team = 떡잎마을 방범대 teamSize = 2 team = 떡잎마을 방범대 teamSize = 2
떡잎마을 방범대가 뻥튀기 되었다!
join 결과가 이런 식으로 나오기 떄문
t.team_id | t.teamname | u.team_id | u.user_id | u.username |
1 | 떡잎마을 방범대 | 1 | 1 | 짱구 |
1 | 떡잎마을 방범대 | 1 | 2 | 유리 |
→ distinct!
jpa의 distinct는
sql의 distinct를 추가하고 또 애플리케이션에서 중복되는 데이터를 없애준다.