
JPQL 경로 표현식
select m.username -- 상태 필드
from Member m
join m.team t -- 단일 값 연관 필드
join m.orders o -- 컬렉션 값 연관 필드
where t.name = '팀A'
경로 표현식이란 .(점)을 찍어 탐색하는 것을 의미한다. 우선 위 SQL을 보는 것만으로는 이해가 쉽게 되지 않으니 다음 경로 표현식 용어 정리를 살펴보자.
// Entity : Member
// target : 단일 값 연관 필드
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
// Entity : Member
// target : 컬렉션 값 연관 필드
@OneToMany(mappedBy = "member")
private List<Order> order = new ArrayList<>();
상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex: m.username)
연관 필드(association field): 연관관계를 위한 필드
// m.username에 다음에 '.' 을 찍어서 탐색이 불가능 하다.
// 즉, 상태 필드는 경로 탐색의 끝이라 할 수 있다.
String query = "select m.username.컬럼or엔티티 From Member m"; //불가
List<String> resultList = em.createQuery(query, String.class)
.getResultList();
// 단일 값 연관 필드
// @ManyToOne, @OneToOne 참조를 하면 탐색이 가능하고
// -> (중요) 묵시적 내부 조인이 발생한다
String query = "select m.team From Member m"; // 연관관계인 team을 불러옴
List<JpqlTeam> resultList = em.createQuery(query, Team.class)
.getResultList();
for (Team team : resultList) {
System.out.println("team = " + team);
}
// 해당 JPQL을 실행한 결과, 묵시적 내부 조인(INNER JOIN) 발생
// m.team을 통해 team만 가져오라고 했는데, Member와 Team을 조인해서 가져온다.
Hibernate:
/* select
m.team
From
JpqlMember m */ select
jpqlteam1_.TEAM_ID as team_id1_13_,
jpqlteam1_.name as name2_13_
from
MEMBER member0_
inner join
TEAM team1_
on member0_.TEAM_ID=team1_.TEAM_ID
// 컬렉션 값 연관 경로
String query = "select t.members From Team t";
Collection resultList = em.createQuery(query, Collection.class)
.getResultList();
💡 묵시적 조인은 사용하지 말고, 명시적 조인을 사용해야 한다.
String query = "select t.memberList From Team t join t.members m";
// JPQL
// 묵시적 내부 조인 발생, 상당히 위험하다
select o.member from Order o
-- SQL
-- 위 JPQL 쿼리와 아래 SQL문이 동일하다 봐도 무방
select m.*
from Orders o
inner join Member m on o.member_id = m.id
실무에서는 웬만하면 명시적 조인을 사용하여 데이터를 조회 해야 한다
select m from Member m join m.team tselect m.team from Member m// 성공 여부 - o
select o.memeber.team
from Order o
// 성공 여부 - o
select t.memberList from Team
// 성공 여부 - x~
select t.memberList.username from Team t
// 성공 여부 - o
select m.username from Team t join t.memberList m
경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해
SQL의 FROM(JOIN) 절에 영향을 줄 수 있다
출처
자바 ORM 표준 JPA 프로그래밍 강의
게시글 속 자료는 모두 위 강의 속 자료를 사용했습니다.