본문 바로가기
[JAVA]/JPA

JPQL - 경로 표현식

by 팡펑퐁 2023. 5. 4.
728x90

경로표현식

  • .(점)을 찍어 객체 그래프를 탐색하는 것을 말한다.
SELECT m.username -- > 상태 필드
	FROM Member m
    JOIN m.team t -- > 단일 값 연관 필드
    JOIN m.orders o -- >  컬렉션 값 연관 필드
WHERE t.name = '팀A'

 

용어 정리

상태 필드(state field)

  • 단순히 값을 저장하기 위한 필드
  • ex) m.username

연관필드(association field)

  • 연관관계를 위한 필드
  • 단일 값 연관 필드
  • @ManyToOne, @OneToOne
  • 대상이 엔티티(ex: m.team)

컬렉션 값 연관 필드

  • @OneToMany, @ManyToMany
  • 대상이 컬렉션(ex: m.orders)

 

 

명시적 조인

  • join 키워드를 직접 사용하는 것을 말한다.
  • SELECT m FROM Member join m.team t

묵시적 조인

  • 경로 표현식에 의해 묵시적으로 SQL 조인 발생하는 것을 말한다.(내부 조인만 가능)
  • SELECT m.team FROM Member m

 

 

특징

상태필드

  • 경로 탐색의 끝이므로 더 이상 탐색되지 않는다.
SELECT m.username -- username에서 다시 .을 붙여서 탐색이 불가능하다.

단일 값 연관 경로

  • 묵시적 내부 조인(inner join) 발생
  • 탐색이 더 가능하다.
SELECT m.team From Member m -- 묵시적인 내부 조인(inner join)이 발생하므로 조심히 써야한다.
m.team.name -- 탐색이 더 가능

컬렉션 값 연관 경로

  • 묵시적 내부 조인(inner join) 발생
  • 탐색이 불가능하다.
SELECT m.orders FROM Member m -- 묵시적인 내부 조인(inner join) 발생
-- m.orders.size 컬렉션이기 때문에 .size 정도 외에는 탐색이 불가능하다.
  • FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능하다.
SELECT o.orders.name FROM Member m join m.orders o

 

 

경로 탐색을 사용한 묵시적 조인 시 주의사항

  • 항상 내부 조인이 발생한다.
  • 컬렉션은 경로 탐색의 끝이기 때문에 명시적 조인을 통해 별칭을 얻어야 탐색을 이어나갈 수 있다.
  • 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM (JOIN) 절에 영향을 준다는 것을 잊지 말자.

 

 

실무 조언

  • 실무에서는 묵시적 내부 조인을 쓰지 않는 것이 좋다. 항상 명시적 조인을 사용하자.
  • 조인은 SQL 튜닝에 중요한 포인트이기 때문이다.
  • 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다는 것이 문제이다.

 

 

상태 필드 경로 탐색

JPQL

  • SELECT m.username, m.age FROM Member m

SQL

  • SELECT m.username, m.age FROM Member m

 

단일 값 연관 경로 탐색

JPQL

  • SELECT o.member FROM Order o

SQL

  • SELECT m.*
  • FROM Orders o
  • inner join Member m on o.member_id = m.id
  • 묵시적 내부 조인 쿼리가 나가므로 실무 사용은 나중에 큰 문제를 야기할 수 있다.

 

 

 

참고

김영한 - 자바 ORM 표준 JPA 프로그래밍

 

728x90

'[JAVA] > JPA' 카테고리의 다른 글

JPQL - 다형성 쿼리  (0) 2023.05.13
JPQL - fetch join  (0) 2023.05.13
JPQL 함수  (0) 2023.05.03
JPQL 조건식 - CASE 식  (0) 2023.05.03
JPQL - 타입 표현과 기타식  (0) 2023.05.01