조인 문에 대한 예제와 테스트는 눈으로 확인 해 보고 싶어서
println
으로 찍어 확인해 보았습니다.셋업
@BeforeEach void setUp() { Team team = new Team("떡잎마을 방범대"); teamRepository.save(team); Team team2 = new Team("데브코스 2기 C반"); teamRepository.save(team2); User user = new User("짱구"); user.setTeam(team); userRepository.save(user); User user2 = new User("유리"); user2.setTeam(team); userRepository.save(user2); User user3 = new User("치타"); userRepository.save(user3); }
user_id | username | team_id |
1 | 짱구 | 1 |
2 | 유리 | 1 |
3 | 치타 | null |
team_id | teamname |
1 | 떡잎마을 방범대 |
2 | 데브코스 2기 C반 |
조인
이너조인
@Test void 이너조인(){ String jpql = "select u from User u join u.team t"; List<User> resultList = em.createQuery(jpql, User.class) .getResultList(); for (User user : resultList) { System.out.println("user = " + user.getUsername() + " team = " + user.getTeam().getName()); } }
Hibernate: select user_id, team_id, username from user u inner join team t on u.team_id=t.team_id user = 짱구 team = 떡잎마을 방범대 user = 유리 team = 떡잎마을 방범대
레프트 조인
@Test void 레프트조인(){ String jpql = "select u from User u left join u.team t"; List<User> resultList = em.createQuery(jpql, User.class) .getResultList(); for (User user : resultList) { System.out.println("user = " + user.getUsername() + " team = " + (user.getTeam()!=null? user.getTeam().getName() : "null")); } }
Hibernate: select user_id, team_id, username from user u left outer join team t on u.team_id=t.team_id user = 짱구 team = 떡잎마을 방범대 user = 유리 team = 떡잎마을 방범대 user = 치타 team = null
서브 쿼리
나이가 평균보다 많은 회원
select m from Member m where m.age > (select avg(m2.age) from Member m2)
한건이라도주문한고객
select m from Member m where (select count(o) from Order o where m = o.member) > 0
서브 쿼리 지원 함수
- [NOT] EXISTS (subquery)
- {ALL|ANY|SOME} (subquery)
- [NOT] IN (subquery)
JPA 서브 쿼리 한계
- FROM 절에서는 사용 못함