[Spring Boot] JPA 강의 정리-34 (JPQL 경로표현식)

Posted by 김성철

SpringBoot - JPA 강의 정리-34(JPQL 경로 표현식)

실무에서 사용할때

실무에서는 명시적 조인을 가급적 사용할 것 (거의 대부분사용해야함)  
묵시적 조인을 사용할 경우 쿼리가 어디서 어떻게 실행되는지 파악하기 힘듬  
튜닝도 힘듬  

경로 표현식

- .(점) 을 찍어 객체 그래프를 탐색하는 것  
=====================================================================  
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 ->성공