1. 경로 표현식이란?
.(점)을 찍어 객체 그래프를 탐색하는 것이다.
select m.username from Member m join m.team t where t.name = "teamA"
- m.username, m.team, t.name 모두 경로 표현식을 사용한다.
2. 경로 표현식의 종류
(1) 상태 필드(state field)
- 단순히 값을 저장하기 위한 필드(or 프로퍼티)
(2) 연관 필드(association field)
- 연관관계를 위한 필드, 임베디드 타입 필드(or 프로퍼티)
(i) 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티
(ii) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username; //상태 필드
private int age; //상태 필드
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM")
private Team team; //연관 필드 (단일 값 연관 필드)
@OneToMany(mappedBy = "member")
private List<Order> orders; //연관 필드 (컬렉션 값 연관 필드)
}
- 상태 필드 : m.username, m.age
- 단일 값 연관 필드 : m.team
- 컬렉션 값 연관 필드 : m.orders
명시적 조인 vs 묵시적 조인
(1) 명시적 조인 : JOIN을 직접 적어주는 것
ex) select m from Member m join m.team t
(2) 묵시적 조인 : 경로 표현식에 의해서 묵시적으로 조인이 일어나는 것, 내부 조인만 할 수 있다.
3. 경로 표현식의 특징
(1) 상태 필드 경로
경로 탐색의 끝이다. 더는 탐색할 수 없다.
(JPQL)
select m.username, m.age from Member m
(SQL)
select m.usernmae, m.age from Member m
(2) 단일 값 연관 경로
묵시적으로 내부 조인이 일어난다. 단일 값 연관 경로는 계속 탐색할 수 있다.
(JPQL)
select m.team from Member m
(SQL)
select t.* from Member m inner join Team t on m.team_id=t.id
- m.team을 통해 Member에서 Team으로 단일 값 연관 필드로 경로 탐색을 했다.
- 단일 값 연관 필드로 경로 탐색을 하면 SQL에서 내부 조인이 일어난다. (묵시적 조인)
(3) 컬렉션 값 연관 경로
묵시적으로 내부 조인이 일어난다. 더는 탐색할 수 없다.
- from 절에서 조인을 통해 별칭을 얻으면 별칭으로 탐색할 수 있다.
select t.members from Team t //성공
select t.members.username from Team t //실패
- 컬렉션까지는 경로 탐색이 가능하다.
- 컬렉션에서 경로 탐색을 시작하는 것은 불가능하다.
- 만약 컬렉션에서 경로 탐색을 하고 싶다면 조인을 사용해서 새로운 별칭을 획득해야 한다.
- from 절에서 명시적 조인을 통해 별칭을 얻는다.
select m.username from Team t join t.members m
- join t.members m 으로 컬렉션에 새로운 별칭을 얻었다. 다시 경로 탐색을 할 수 있다.
4. 경로 탐색을 사용한 묵시적 조인 시 주의사항
- 묵시적 조인은 항상 내부 조인이다.
- 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM 절에 영향을 준다.
- 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다.
- 실무에서는 묵시적 조인 대신에 명시적 조인을 사용하자.
반응형
'JPA > JPA' 카테고리의 다른 글
[JPA] JPQL - Named 쿼리 (정적 쿼리) (0) | 2022.01.08 |
---|---|
[JPA] JPQL - 조건식 (0) | 2022.01.08 |
[JPA] JPQL - 페치 조인(Fetch Join) (0) | 2022.01.07 |
[JPA] JPQL - 조인(Join) (0) | 2022.01.07 |
[JPA] JPQL - 기본 문법 (0) | 2022.01.07 |
댓글