실무에서는 명시적 조인을 가급적 사용할 것 (거의 대부분사용해야함)
묵시적 조인을 사용할 경우 쿼리가 어디서 어떻게 실행되는지 파악하기 힘듬
튜닝도 힘듬
- .(점) 을 찍어 객체 그래프를 탐색하는 것
=====================================================================
select m.username ->상태필드
from Member m
join m.team t -> 단일 값 연관 필드
join m.orders o -> 컬렉션 값 연관 필드
where t.name = '팀A'
=====================================================================
- 상태 필드 (state field) : 단순히 값을 저장하기 위한 필드
경로 탐색의 끝 , 탐색X
ex) m.username
=====================================================================
String query = "select m.username From Member m";
=====================================================================
- 연관 필드 (association field) : 연관관계를 위한 필드
- 단일 값 연관 필드 :
묵시적 내부 조인(inner join) 발생, 탐색O
@ManyToOne , @OneToOn , 대상이 엔티티(ex : m.team)
=====================================================================
String query = "select m.team.name From Member m";
=====================================================================
위와같이 Team 안에 있는 객체를 탐색 할 수 있음
※ 쿼리문을 잘못 작성하면 join이 발생함, 실무에서는 주의할것
- 컬렉션 값 연관 필드 :
묵시적 내부 조인 발생 , 탐색 X
FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능
@OneTmMany , @ManyToMany , 대상이 컬렉션(ex : m.orders)
=====================================================================
String query = "select t.member.name From Team t"; //오류
=====================================================================
위와같이 사용 불가능
아래와 같이 명시적 조인을 해야함
=====================================================================
String query = "select m.username From Team t join t.members m";;
=====================================================================
Join 키워드 직접 사용
=====================================================================
select m from Member m join m.team t
=====================================================================
경로 표현식에 의해 묵시적으로 SQL 조인 발생 (내부조인만 가능)
=====================================================================
select m.team from Member m
=====================================================================
select o.member.team from Order o -> 성공
select t.members from Team -> 성공
select t.members.username from Team t -> 실패
select m.username from Team t join t.members m ->성공