경로 표현식
- 점을 찍어 객체 그래프를 탐색하는 것
select m.username //-> 상태 필드 from Member m join m.team t //-> 단일 값 연관 필드 join m.orders o //-> 컬렉션 값 연관 필드 where t.name = '팀A'
- 상태 필드 - 단순히 값을 저장하기 위한 필드
- 탐색 X
- 연관 필드 - 연관관계를 위한 필드
- 단일 값 (@XToOne) - 대상이 엔티티
- implicit inner join, 탐색 o
- 컬렉션 값(@XToMany) - 대상이 컬렉션
- implicit inner join, 탐색 x
- from 절에서 explicit join을 통해 alias 를 얻어 탐색 가능
상태 필트 경로 표현식
@Test void 모든_사용자의_이름_조회(){ String jpql = "select u.username from User u"; List<String> resultList = em.createQuery(jpql, String.class) .getResultList(); for (String name : resultList) { System.out.println("name = " + name); } }
Hibernate :select username from user name = 짱구 name = 유리 name = 치타
@Test void 이름이_짱구인_사용자_조회(){ String jpql = "select u from User u where u.username ='짱구'"; User user = em.createQuery(jpql, User.class).getSingleResult(); System.out.println("userId =" + user.getId() + ", username =" + user.getUsername()); }
Hibernate: select user_id,team_id,username from user where username='짱구'
단일 값 연관 필드
@Test void 모든_멤버의_팀목록_조회(){ String jpql = "select u.team from User u"; List<Team> resultList = em.createQuery(jpql, Team.class) .getResultList(); for (Team team : resultList) { System.out.println("team = " + team.getName()); } }
Hibernate: select t.team_id t.teamname from user u inner join team t on u.team_id=t.team_id team = 떡잎마을 방범대 team = 떡잎마을 방범대
implicit inner join의 발생으로 팀이 있는 멤버의 팀이 모두 조회되었다.
이때 짱구와 유리의 팀인 떡잎마을 방범대가 중복되었다.
컬렉션 값 연관 필드
@Test void 팀의_사용자조회(){ String jpql = "select t.users from Team t"; Collection resultList = em.createQuery(jpql, Collection.class) .getResultList(); for (Object o : resultList) { System.out.println("o = " + ((User)o).getUsername()); } }
Hibernate: select u.user_id, u.team_id, u.username from team t inner join user u on t.team_id=u.team_id o = 짱구 o = 유리
역시 implicit inner join이 발생하였다.