반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
조인(Join)
JPQL은 SQL과 마찬가지로 조인(JOIN)을 제공한다.
관계형 데이터베이스 SQL의 조인 기능과 같은 기능을 하지만 문법은 약간 다르다.
내부 조인(Inner Join)
내부 조인은 INNER JOIN을 사용한다.
- INNER는 생략 가능하다.
SELECT m FROM Member m [INNER] JOIN m.team t
내부 조인 사용 예
String query = "select m from Member m inner join m.team t";
List<Member> result = em.createQuery(query, Member.class).getResultList();
- JPQL의 내부 조인은 SQL의 조인과 약간 다르다.
- JPQL 조인은 연관 필드를 사용한다.
- Member m join m.team t : 회원이 가지고 있는 연관 필드로 Team과 조인
외부 조인(Outer Join)
외부 조인은 LEFT OUTER JOIN을 사용한다.
- OUTER는 생략 가능하다.
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
외부 조인 사용 예
String query = "select m from Member m left outer join m.team t";
List<Member> result = em.createQuery(query, Member.class).getResultList();
- 외부 조인은 기능상 SQL 외부 조인과 같다.
컬렉션 조인(Collection Join)
일대다 관계나 다대다 관계처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.
- [회원 → 팀]은 다대일 조인이면서 단일 값 연관 필드(m.team)를 사용한다.
- [팀 → 회원]은 일대다 조인이면서 컬렉션 값 연관 필드(m.members)를 사용한다.
SELECT t, m FROM Team t LEFT JOIN t.members m
- Team과 Team이 보유한 회원 목록을 컬렉션 값 연관 필드로 조인
세타 조인(Theta Join)
세타 조인은 WHERE 절을 사용하여 작성할 수 있다.
select count(m) from Member m, Team t where m.username = t.name
- 세타 조인은 내부 조인만 지원한다.
- 전혀 관계가 없는 엔티티도 조인할 수 있다.
조인 - ON 절
JPA 2.1부터 조인할 때 ON 절을 지원하며, ON 절은 조인 대상을 필터링하고 조인할 수 있다.
- 내부 조인의 ON 절은 WHERE 절을 사용할 때와 결과가 같다.
- 보통 ON 절은 외부 조인에서만 사용한다.
- 하이버네이트 5.1부터 연관관계가 없는 엔티티 외부 조인이 가능하다.
조인 대상 필터링
회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인할 경우
// JPQL
SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'
// SQL
SELECT m.*, t.* FROM Member m LEFT JOIN Team ON m.TEAM_ID=t.id and t.name='A'
연관관계가 없는 엔티티 외부 조인
회원의 이름과 팀의 이름이 같은 대상 외부 조인할 경우
// JPQL
SELECT m, t FROM Member m LEFT JOIN Team t on m.username = t.name
// SQL
SELCT m.*, t.* FROM Member m LEFT JOIN Team t ON m.username = t.name
반응형
'프레임워크(Framework) > JPA' 카테고리의 다른 글
[JPA] JPQL 타입 표현과 기타식, 조건식 - 객체지향 쿼리 언어 JPQL (6) (0) | 2022.12.18 |
---|---|
[JPA] JPQL 서브 쿼리 - 객체지향 쿼리 언어 JPQL (5) (0) | 2022.12.17 |
[JPA] JPQL 페이징(Paging) API - 객체지향 쿼리 언어 JPQL (3) (0) | 2022.12.15 |
[JPA] JPQL 프로젝션(Projection) - 객체지향 쿼리 언어 JPQL (2) (0) | 2022.12.14 |
[JPA] JPQL이란? - 객체지향 쿼리 언어 JPQL (1) (0) | 2022.12.13 |