JPQL2
JPQL2
경로 표현식
쿼리문에서 .을 찍어 객체 그래프를 탐색하는 것
상태필드 : 단순히 값을 저장히기 위한 필드
private String username; //상태필드
연관필드: 연관 관계를 위한 필드
- 단일 값 연관 필드
- @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team)
- 컬렉션 값 연관 필드:
- @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders)
특징
-
상태필드: 경로 탐색의 끝, 탐색X
"SELECT m.username, m.age FROM Member m"
-
단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색O
String query="select m.team From Member m"; // Member Team사이의 내부조인 발생
문제는 큰 애플리케이션에서 내부조인을 사용시 성능상 문제
실무에서 사용 권장X
-
컬렉션 값 연관 경로: 묵시적 내부조인 발생, 탐색 X
String query="select m From Team t join t.members m"; // 'm' 별칭을 얻어 별칭을 통해 탐색
페치 조인 (fetch join)
SQL 조인 종류X
JPQL에서 성능 최적화를 위해 제공하는 기능
연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능
엔티티 페치 조인
-
회원을 조회하면서 연관된 팀도 함께 조회(SQL 한 번에)
// item 중에 book,movie를 조회해라 //[JPQL] select m from Member m join fetch m.team //[SQL] SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID
페치 조인과 Distinct
SQL의 DISTINCT는 중복된 결과를 제거하는 명령
JPQL의 DISTINCT 2가지 기능 제공
- SQL에 DISTINCT를 추가
- 애플리케이션에서 엔티티 중복제거
페치 조인의 특징과 한계
- 페치 조인대상에는 별칭을 줄 수 없다.
- 하이버네이트는 가능, 가급적 사용X
- 둘 이상의 컬렉션은 페치 조인 할 수 없다.
- 다대다
@BatchSize(size=100)
페치조인 -정리
모든 것을 페치 조인으로 해결할 수 는 없음
페치 조인은 객체 그래프를 유지할 때 사용하면 효과적
다형성 쿼리
TYPE
예) Item 중에 Book, Movie를 조회해라
//[JPQL]
select i from Item i
where type(i) IN (Book, Movie)
//[SQL]
select i from i
where i.DTYPE in (‘B’, ‘M’)
TREAT(JPA 2.1)
예) 부모인 Item과 자식 Book이 있다.
//[JPQL]
select i from Item i
where treat(i as Book).author = ‘kim’
//[SQL]
select i.* from Item i
where i.DTYPE = ‘B’ and i.author = ‘kim’
엔티티 직접 사용
JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용
Named 쿼리 - 정적 쿼리
어노테이션,xml에 정의
애플리케이션 로딩 시점에 초기화 후 재사용
애플리케이션 로딩 시점에 쿼리를 검증