JOIN 키워드를 직접 사용하는 것
select m from Member m join m.team t
경로 표현식에 의해 묵시적으로 SQL 조인이 발생하는 것 (내부 조인만 가능)
select m.team from Member m
경로 표현식이란 .(점)
을 찍어 객체 그래프를 탐색하는 것이다.
select m.username -> 상태 필드
from Member m
join m.team t -> 단일 값 연관 필드
join m.orders o -> 컬렉션 값 연관 필드
where t.name = '팀A'
단순히 값을 저장하기 위한 필드이다. (ex: m.username)
경로 탐색의 끝이므로 탐색을 더 이상 할 수 없다.
JPQL : select m.username, m.age from Member m
SQL : select m.username, m.age from Member m
@ManyToOne
, @OneToOne
이 붙어 있는 필드이며 엔티티를 대상으로 한다.
묵시적 내부 조인이 발생하며 탐색을 할 수 있다.
JPQL : select o.member from Order o
SQL : select m.* from Orders o inner join Member m on o.member_id = m.id
select o.member.team from Order o (O)
// o.member의 경우 단일값 연관필드이므로 탐색이 가능하다.
@OneToMany
가 붙어있는 필드이며 컬렉션을 대상으로 한다.
묵시적 내부 조인이 발생하며 탐색을 더 이상 할 수 없다.
JPQL : select t.members from Team
SQL : select m.* from Team t inner join Member m on t.member_id = m.id
select t.members.username from Team t (X)
// t.members는 컬렉션 연관필드이므로 탐색이 불가능하다.
select m.username from Team t join t.members m
// 굳이 컬렉션 연관필드를 경로탐색하고 싶다면 명시적 조인을 사용해야 한다.
묵시적 조인은 항상 내부 조인임을 잊지말자.
컬렉션은 경로 탐색의 끝이며 명시적 조인을 통해 별칭을 얻어야 한다.
경로 탐색은 SELECT, WHERE 절에서 사용하지만 묵시적 조인에 의해 SQL의 FROM (JOIN)절에 영향을 주는 것을 잊지말자.
가급적 묵시적 조인 대신에 명시적 조인을 사용할 것
조인은 SQL 튜닝에 중요 포인트이다.
묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다. -> 가독성이 떨어진다.