[JPA] JPQL 조인방식

yookyungmin·2023년 8월 21일
0

프로젝트를 진행하면서 JPQL 과 QueryDsl 을 사용해보았지만 아직 능숙하지 않은거 같아 책을 보며 공부 했던 내용을 블로그 작성해보려 한다.

JPQL 조인

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

내부조인

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

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

외부조인 - LEFT[OUTER] JOIN

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

컬렉션 조인

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

  • [회원->팀] 으로의 조인은 다대일 조건이면서 단일 값 연관 필드(m.team)를 사용한다.
  • [팀->회원]은 반대로 일대다 조인이면서 컬렉션 값 연관 필드(m.menibers)를 사
    용한다
  • 컬렉션 조인 시 JOIN 대신에 N을 사용할 수 있는데, 기능상 JOIN과 같지만 컬렉션일 때만 사용
    할 수 있다. 과거 EJB 시절의 유물이고 특별한 장점도 없으므로 그냥 JOIN 명령어를 사용하자.
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 는 팀과 팀이 보유한 회원목록을 컬렉션 값 연관필드로 외부조인했다.

세타 조인

  • 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 절(JPA2.1)

  • JPA 2.1부터 조인 할때 ON절을 지원한다.
  • ON절을 사용하면 조인 대상을 필터링 하고 조인 할 수 있다.
  • 내부 조인의 ON 절은 WHERE 절을 사용할 때와 결과가 같으므로 보통 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=1A1

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

프로젝트 때 사용해본 건 한정적이지만 기회가 되면 적용해보고 싶다.

참고 : 자바 ORM 표준 JPA 프로그래밍

0개의 댓글