본문 바로가기

개발중/Java Persistence API (JPA)

JPQL JOIN

728x90
반응형

JPQL JOIN

JPQL도 조인을 지원한다. SQL 과 조인 기능은 같고 문법만 약간 다르다.


🟣 내부 조인

내부 조인은 INNER JOIN 을 사용한다. 참고로 INNER 를 생략할 수 있다.


String teamName = "TEAM1"

String query = "SELECT m FROM Member m INNER JOIN m.team t WHERE t.name = :teamName"

 

List<Member> members;

members = em.createQuery( query, Member.class ).setParameter("teamName", teamName).getResultList();


회원과 팀을 내부 조인해서 'TEAM1' 에 소속된 회원을 조회하는 다음 JPQL 을 보자.

 

SELECT m FROM Member m INNER JOIN m.team t WHERE t.name = :teamName


JPQL 내부 조인 구문을 보면 SQL의 조인과 약간 다른 것을 확인 할 수 있다.

JPQL 조인의 가장 큰 특징은 연관 필드를 사용한다는 것이다.

 

여기서 m.team 이 연관필드인데 연관 필드는 다른 엔티티와 연관관계를 가지기 위해 사용하는 필드를 말한다.


  • FROM Member m
    • 회원을 선택하고 m 이라는 별칭을 주었다.
  • Member m JOIN m.team t
    • 회원이 가지고 있는 연관 필드로 팀과 조인한다.
    • 조인한 팀에게는 t 라는 별칭을 주었다

혹시라도 JPQL JOIN 을 SQL JOIN 처럼 사용하면 문법 오류가 발생한다.

 

JPQL 은 JOIN 명령어 다음에 조인할 객체의 연관 필드를 사용한다.


🟣 외부 조인

외부 조인은 기능상 SQL JOIN 과 같다.

OUTER 는 생략 가능해서 보통 LEFT JOIN 으로 사용 가능하다.


JPQL

 

SELECT m FROM Member M LEFT [OUTER] JOIN m.team t


SQL

 

SELECT M.ID AS ID

           , M.AGE AS AGE

  FROM MEMBER M LEFT OUTER JOIN TEAM T ON M.TEAM_ID = T.ID

 WHERE T.NAME = ?

 


🟣 컬렉션 조인

 

일대다 관계나 다대다 관계처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.

 

  • [ 회원 - > 팀 ] 으로의 조인은 다대일 조인이면서 단일 값 연관 필드( m.team )를 사용한다.
  • [ 팀 - > 회원 ] 은 반대로 일대다 조인이면서 컬렉션 값 연관 필드( m.members )를 사용한다.

여기서   t LEFT JOIN t.members 

팀과 팀이 보유한 회원 목록을 컬렉션 값 연관 필드로 외부 조인했다.

 

SELECT t , m

 FROM Team t LEFT JOIN t.members m

 


컬렉션 조인 시 JOIN 대신에 IN 을 사용할 수 있는데 기능상 JOIN 과 같지만 콜렌션 일 때만 사용할 수 있다.

과거 EJB 시절의 유물이고 특별한 장점도 없으므로 그냥 JOIN 문 사용하자.

 

SELECT t, m FROM Team t, IN ( t.members ) m


🟣 세타 조인

WHERE 절을 사용해서 세타 조인을 할 수 있다.

참고로 세타 조인은 내부 조인만 지원한다.

 

세타 조인을 사용하면 전혀 관계없는 엔티티도 조인할 수 있다.


JPQL

 

SELECT COUNT(M) FROM Member m, TEAM T

WHERE m.username = t.name


SQL

SELECT COUNT(M.ID) FROM MEMBER M CROSS JOIN TEAM T WHERE M.USERNAME = T.NAME


🟣 JOIN ON 절 ( JPA 2.1 만 지원 )

ON 절을 사용하면 조인 대상을 필터링하고 조인할 수 있다.

참고로 내부 조인의 ON 절은 WHERE 절을 사용할 떄와 결과가 같으므로

보통 ON 절은 외부 조인에서만 사용한다.


JPQL

SELECT m, t FROM Member m LEFT JOIN m.team t ON t.name = 'BIN'


SQL

SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.Team_id AND t.name = 'BIN'


728x90
반응형

'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글

[ JPA ] Save 후 Id 구하기  (0) 2021.12.05
[JPA] 연관 관계 정리  (0) 2021.08.15
JPA - 프로젝션  (0) 2021.07.01
JPA - 결과 조회 getResultList/getSingleResult  (0) 2021.07.01
JPA - 파라미터 바인딩  (0) 2021.07.01