Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] JPQL 경로표현식

by skahn1215 2021. 9. 26.
728x90
반응형

경로 표현식

경로표현식이란 .(점) 으로 접근하여 그래프를 탐색하는 것이다.

 

 

 

묵시적 내부조인

  • 묵시적 내부조인이란 JPA가 자동으로 join을 만드는 것을 말한다.
  • 묵시적 내부조인은 연관관계 때문에 발생한다.
  • 예를 들어 Memeber 클래스 안에 Team 객체가 있다면?
    - DB는 테이블 개념이기 때문에 Member 의 Id 와 일치하는 Team 의 FK 를 기준으로 값을 가져오기 때문이다.
  • 객체에서는 .(접근자) 로 조회 하지만 DB 에서는 Join 으로 가져오는 방법밖에 없다.
  • 결론부터 말하면 묵시적 조인은 절대 쓰면 안된다.
  • 예측하기 힘들고 튜닝할때 힘들다.

 

 

표현 필드 종류

상태필드

  • 단순히 값을 저장하기 위한 필드
  • m.username 정도 된다.

연관필드:

  • 단일값 연관필드:
     - 대상이 엔티티 인 필드이다.
     - 해당 객체 안에 포함되어있는 객체를 말한다.
     - private Team team;

 

  • 컬렉션 값 연관필드
     - 대상이 컬렉션인 객체
     - 해당 객체안에 컬렉션으로 객체를 가지고 있는경우
     - private List<Member> members;

 

예제

select
    m.username -> 접근자(.)을 이용하여 값을 바로 찍은것은 상태 필드이다.
from Member m
    join m.team -> 엔티티로 넘어 갔기 때문에 단일값 연관 필드라 한다.
    join m.orders o -> 컬렉션 값 연관 필드 이다.
where t.name = 'teamA'

 

 

 

경로표현식의 특징

상태필드

  • 경로탐색의 끝이다 더이상 갈 곳이 없다. 
  • 탐색이 불가능하다.
  • m.username 에서 더이상 탐색할게 없다.

 

단일값 연관경로

  • 묵시적 내부조인이 발생한다.
  • 탐색이 가능하다.
  • m.team.name
    - 멤버 객체에서 team 에 접근후 다시 team.name 으로 접근했다.

 

컬렉션값 연관경로

  • 묵시적 내부조인이 발생한다.
  • 탐색이 불가능하다.
  • 탐색을 하고 싶은경우 join 문을 명식적으로 사용하여 별칭을 이용한여 접근한다.
// collection 예제
String collectionQuery = "select t.members from JPQLTeam t";
List<Collection> result = em.createQuery(collectionQuery, Collection.class)
        .getResultList();

System.out.println("getCollection = " + result);


// members 에서 username을 가져오고 싶은경우
// 직접 join 문을 써서 별칭으로 가져온후 접근한다.
String collectionQuery2 = "select m.username from JPQLTeam t join t.members m";
List<String> result2 = em.createQuery(collectionQuery2, String.class)
        .getResultList();

for(String name : result2) {
    System.out.println("getCollection = " + name);
}

 

 

 

 

참고:

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21727?tab=note&mm=close 

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] JPQL 엔티티 직접 사용  (0) 2021.09.28
[JPA] JPQL Fetch Join  (0) 2021.09.26
[JPA] JPQL 기본함수, 사용자 정의 함수 호출  (0) 2021.09.25
[JPA] JPQL CASE  (0) 2021.09.25
[JPA] JPQL TYPE  (0) 2021.09.24

댓글