@Test void ์ฌ์ฉ์_์กฐํ_ํ์น_์กฐ์ธ() { String jpql = "select u from User u join fetch u.team"; List<User> resultList = em.createQuery(jpql, User.class).getResultList(); System.out.println("==========================="); for (User user : resultList) { System.out.println("username : " + user.getUsername()); } System.out.println("==========================="); for (User user : resultList) { System.out.println("username = " + user.getUsername()); Team team = user.getTeam(); System.out.println(team.getClass()); System.out.println("user teamName = " + team.getName()); System.out.println(); } }
fetch join ์ ์ฉ (fetch type ์ ์๊ด ์์)
๋ฐ์ ์ฟผ๋ฆฌ ๋ก๊ทธ
Hibernate: select u.id, t.id u.team_id u.username, t.teamname from user u inner join team t on u.team_id=t.id
์ถ๋ ฅ ๋ก๊ทธ
=========================== username : ์งฑ๊ตฌ username : ์ ๋ฆฌ username : ์นํ username : ์ฝ๋ =========================== username = ์งฑ๊ตฌ class com.study.jpql.domain.Team user teamName = ํด๋ฐ๋ผ๊ธฐ๋ฐ username = ์ ๋ฆฌ class com.study.jpql.domain.Team user teamName = ํด๋ฐ๋ผ๊ธฐ๋ฐ username = ์นํ class com.study.jpql.domain.Team user teamName = ์ฅ๋ฏธ๋ฐ username = ์ฝ๋ class com.study.jpql.domain.Team user teamName = ์ด๋ฆฐ์ด ํ์ ๋จ
ํ์น ์กฐ์ธ์ ํตํด ๋จ ํ๋ฐฉ์ join ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๊ณ ๊ฒฐ๊ณผ ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ jpa ๊ฐ ๋ง๋ฒ์ฒ๋ผ ๋งคํ ํด ์ฃผ์์ต๋๋ค.
๋ง์ฝ ์ฌ๊ธฐ์ fetch ํค์๋๋ฅผ jpql์์ ์ ๊ฑฐํ๋ฉด ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ์ง๋ง jpa๋ ์ด๋ฅผ ์ฑ์์ผ ํ ๊ทผ๊ฑฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ป์ด์จ t.teamname ๊ณผ ๊ฐ์ team์ ํ๋๋ฅผ ๊ทธ๋ฅ ๋ฒ๋ฆฝ๋๋ค.
์ดํ์ ์ฐ๊ด๊ด๊ณ์ fetch ์ต์
(EAGER/LAZY)์ ๋ฐ๋ผ ์ถ๊ฐ ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ ์ํต๋๋ค.
์ปฌ๋ ์ ํ์น ์กฐ์ธ
ํ์ ์กฐํ ํ๋ฉฐ ์์๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ์กฐํํ๋ @OneToMany์ ๊ด๊ณ์์์ fetch join๋ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
@Test void ํ_์กฐํ_ํ์น_์กฐ์ธ() { 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.print("team = " + team.getName()); System.out.print(" -> "); for (User user : team.getUsers()) { System.out.print(user.getUsername()+" "); } System.out.println(); } }
Hibernate: select t.id, u.id, t.teamname, u.team_id u.username u.team_id, u.id from team t inner join user u on team0_.id=users1_.team_id
ํ๋ฐฉ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์๊ณ ํ ๋ฐ์ดํฐ์ ์ปฌ๋ ์
์ฐ๊ด๊ด๊ณ์ธ users field์ ๋ํด ๋งคํ์ ์ ํด์ฃผ์์ต๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ดํด ๋ณด๋ฉด ๋ปฅํ๊ธฐ๊ฐ ๋ฐ์ํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
team = ํด๋ฐ๋ผ๊ธฐ๋ฐ -> ์งฑ๊ตฌ ์ ๋ฆฌ team = ํด๋ฐ๋ผ๊ธฐ๋ฐ -> ์งฑ๊ตฌ ์ ๋ฆฌ team = ์ฅ๋ฏธ๋ฐ -> ์นํ team = ์ด๋ฆฐ์ด ํ์ ๋จ -> ์ฝ๋
๋ปฅํ๊ธฐ๊ฐ ๋ฐ์ํ ์ด์ ๋ db ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํด๋ณด๋ฉด ๊ธ๋ฐฉ ์ดํดํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ
t.id | u.id | t.teamname | u.team_id | u.username |
1 | 1 | ํด๋ฐ๋ผ๊ธฐ๋ฐ | 1 | ์งฑ๊ตฌ |
1 | 2 | ํด๋ฐ๋ผ๊ธฐ๋ฐ | 1 | ์ ๋ฆฌ |
2 | 3 | ์ฅ๋ฏธ๋ฐ | 2 | ์นํ |
3 | 4 | ์ด๋ฆฐ์ด ํ์ ๋จ | 3 | ์ฝ๋ |
์ด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก result set์ ๋ด์์ ํ๊ธฐ ๋๋ฌธ์ jpa ๋ ๋ฒจ์์๋ team ๋ฐ์ดํฐ์ ๋ปฅํ๊ธฐ๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์์ต๋๋ค. @NtoMany๊ด๊ณ์ ์ด์ฉ ์ ์๋ ์๋ช
์
๋๋ค.
ํ์ด๋ฒ๋ค์ดํธ๋ ์ด๋ฅผ ์ํ jpql ํค์๋ distinct๋ฅผ ์ ๊ณตํฉ๋๋ค.
distinct
ํค์๋๋ ๋๊ฐ์ง ์ญํ ์ ํฉ๋๋ค.- ์ฟผ๋ฆฌ์ distinct ํค์๋ (sql์ distinct)
- ์ดํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ ์ค๋ณต ๋ฐ์ดํฐ์ ์ ๊ฑฐ (์ฃผ์ ๊ธฐ๋ฐ)
Hibernate: select distinct t.id, u.id, t.teamname, u.team_id u.username u.team_id, u.id from team t inner join user u on team0_.id=users1_.team_id team = ํด๋ฐ๋ผ๊ธฐ๋ฐ -> ์งฑ๊ตฌ ์ ๋ฆฌ team = ์ฅ๋ฏธ๋ฐ -> ์นํ team = ์ด๋ฆฐ์ด ํ์ ๋จ -> ์ฝ๋