// 내부 조인 사용 예제
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은 JOIN 명령어 다음에 조인할 객체의 연관 필드를 사용한다.
// 외부 조인 SQL 예제
SELECT M
FROM MEMBER m LEFT [OUTER] JOIN m.team t
일대다 관계나 다대다 관계처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.
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는 팀과 팀이 보유한 회원목록을 컬렉션 값 연관 필드로 외부 조인했다.
// 회원 이름이 팀 이름과 똑같은 사람 수를 구하는 예제
-- 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(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'로 조인 시점에 조인 대상을 필터링한다.