프레임워크(Framework)/JPA

[JPA] JPQL 조인(Join) - 객체지향 쿼리 언어 JPQL (4)

잇트루 2022. 12. 16. 01:23
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

조인(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
반응형