지우쓰 개발일기
[JPA] JPQL (2) 본문
본 포스팅은 자바 ORM 표준 JPA 프로그래밍 (김영한 저)을 읽고 정리한 내용입니다.
JOIN
INNER JOIN
-
연관 필드로 자동 조인
-
INNER은 기본값이라 생략 가능
-
연관 필드: 다른 엔티티와 연관관계를 갖는 필드
SELECT m
FROM Member m
[INNER] JOIN m.team t
LEFT JOIN
-
연관 필드로 자동 조인
-
OUTER은 생략 가능해서 보통 LEFT JOIN으로 사용
SELECT m
FROM Member m
LEFT [OUTER] JOIN m.team t
COLLECTION JOIN
-
컬렉션을 사용하는 곳에 조인하는 것
-
N:1 JOIN: 단일 값 연관 필드 사용
-
ex) 회원 → 팀
-
-
1:N JOIN: 컬렉션 값 연관 필드 사용
-
ex) 팀 → 회원
-
SELECT t, m
FROM Team t
LEFT JOIN t.members m
THETA JOIN
-
세타 내부 조인만 지원
-
서로 관계 없는 엔티티 간 조인 가능
select count(m) from Member m, Team t
where m.username = t.name
JOIN ON
-
조인 대상 필터링
-
보통 외부 조인에서만 사용
select m, t from Member m
left join m.team t on t.name = 'A'
특징
-
결과를 반환할 때 연관관계까지 고려하지 않음
-
SELECT 절에 지정된 엔티티만 반환됨
FETCH JOIN
연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능
[ LEFT [OUTER] | INNER ] JOIN FETCH 조인경로
엔티티 페치 조인
-
연관된 엔티티를 함께 조회
-
객체 그래프를 유지하면서 조회됨
-
실제 엔티티를 조회했으므로 지연 로딩이 일어나지 않음
select m
from Member m join fetch m.team
컬렉션 페치 조인
-
연관된 컬렉션을 함께 조회
-
객체 그래프를 유지하면서 조회됨
-
실제 엔티티를 조회했으므로 지연 로딩이 일어나지 않음
-
1:N 조인: 조인하면서 결과 개수가 증가해서 같은 데이터를 여러 건 로드함
select t
from Team t join fetch t.members
where t.name = '팀A'
페치 조인 & DISTINCT
-
SQL에 DISTINCT 추가 & 어플리케이션 내에서 중복 제거
특징
-
SQL 호출 횟수를 줄여 성능을 최적화할 수 있음
-
엔티티 로딩 전략보다 우선하기 때문에 fetch join을 사용하면 무조건 함께 조회됨
-
준영속 상태에서도 객체 그래프를 탐색할 수 있음
-
엔티티 모양의 객체 그래프를 유지할 때 효율적
한계
-
fetch join 대상에는 별칭을 줄 수 없음
-
둘 이상의 컬렉션을 fetch할 수 없음
-
컬렉션을 fetch join하면 Paging API를 사용할 수 없음
'Spring Boot > JPA' 카테고리의 다른 글
[JPA] JPQL (4) (0) | 2020.09.21 |
---|---|
[JPA] JPQL (3) (0) | 2020.09.21 |
[JPA] JPQL (1) (0) | 2020.09.17 |
[JPA] 객체지향 쿼리 개요 (0) | 2020.09.15 |
[JPA] 값 타입 (0) | 2020.09.13 |