JPA - 객체지향 쿼리언어(3)

DevSeoRex·2022년 12월 9일
0
post-thumbnail

JPQL 조인

  • JPQL 역시 조인을 지원하고, SQL 조인과 기능은 같고 문법만 약간 다르다

내부 조인 - INENR JOIN

  • 내부 조인은 INNER JOIN을 사용한다 참고로 INNER는 생략할 수 있다.
// 내부 조인 사용 예제
String teamName = "팀A";
String query = "SELECT m FROM Member m INNER JOIN m.team t "
				+ "WHERE t.name = :teamName";

List<Member> members = em.createQuery(query, Member.class)
				.setParameter("teamName", teamName)
                .getResultList();
  • JPQL 조인의 가장 큰 특징은 연관 필드를 사용한다는 것이다.
  • 연관필드란 다른 엔티티와 연관관계를 가지기 위해 사용하는 필드를 말한다.

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

외부 조인 - LEFT [OUTER] JOIN

  • JPQL의 외부 조인은 기능상 SQL의 외부 조인과 같다
  • OUTER는 생략 가능해서 보통 LEFT JOIN으로 사용한다.
// 외부 조인 SQL 예제
SELECT M
FROM MEMBER m LEFT [OUTER] JOIN m.team t

컬렉션 조인

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

  • [회원 -> 팀]으로의 조인은 다대일 조인이면서 단일 값 연관 필드(m.team)를 사용한다.
  • [팀 -> 회원]으로의 조인은 반대로 일대다 조인이면서 컬렉션 값 연관 필드(m.members)를 사용한다.
  • 컬렉션 조인시 JOIN 대신에 IN을 사용할 수 있는데 기능상 JOIN과 같지만 컬렉션일 때만 사용할 수 있고, 특별한 장점도 없기 때문에 JOIN 명령어를 사용하는 것을 권장한다.
    • JOIN 대신 IN을 사용한 컬렉션 조인 예제
SELECT t, m FROM Team t, IN(t.members) m
// 컬렉션 값 연관 필드로 외부 조인 예제
SELECT t, m FROM Team t LEFT JOIN t.members m

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

세타 조인 - CROSS JOIN(Catisian Product)

  • 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)

  • JPA 2.1부터 조인할 때 ON 절을 지원한다.
  • ON 절을 사용하면 조인 대상을 필터링하고 조인할 수 있다.
  • 내부 조인의 ON 절은 WHERE 절을 사용할 때와 결과가 같으므로 보통 ON 절은 외부 조인에서만 사용한다.
// JOIN ON(ON 절) 사용예제

-- 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 t ON m.TEAM_ID = t.id and t.name='A'

💡 SQL 결과를 보면 and t.name = 'A'로 조인 시점에 조인 대상을 필터링한다.

0개의 댓글