JPA [기본] 조인, 서브 쿼리

신재원·2023년 2월 2일
0

JPA 기본

목록 보기
25/31

📌 조인

  • ✔ 내부 조인

    ex ) SELECT m FROM Member m [INNER] JOIN m.team t
    • NULL 행이 존재하지 않는다. (Member는 있고 team이 없으면 조회 X)
    • INNER는 생략 가능하다

      A, B 둘다 겹치는 정보를 조인 하는것이 INNER 조인이다.
  • ✔ 외부 조인

    ex ) SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
    • Member 엔티티를 왼쪽에 두고 겹치는 부분을 JOIN 한다
    • NULL 이 존재
    • OUTER 생략 가능

      A, B 겹치는 정보와 왼쪽에있는 A의 정보까지 조인하는것이 LEFT (OUTER) 조인이다.
  • ✔ 세타 조인 (막 조인)

    ex ) select count(m) from Member m, Team t where m.username = t.name

조인 - ON절

  1. 조인 대상 필터링
    EX ) 회원과 팀을 조인하는데, 팀 이름이 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 t ON m.TEAM_ID = t.id and t.name = 'A'
  1. 연관관계 없는 엔티티 외부 조인
    EX ) 회원의 이름과 팀의 이름이 같은 대상 외부 조인
  • JPQL
    • SELECT m, t FROM Member m LEFT JOIN Team t on m.username = t.name
  • SQL
    • SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.username = t.name

📌 서브 쿼리

EX ) 나이가 평균보다 많은 회원
select m from Member m where m.age > (select avg(m2.age) from Member m2)

  • (select avg(m2.age) from Member m2) 서브 쿼리 부분
  • 메인쿼리 m, 이랑 m2랑 관계가 전혀 없다 = 성능이 잘나온다.

EX ) 한 건이라도 주문한 고객
select m from Member m where (select count(o) from Order o where m = o.member) > 0

JPA 서브 쿼리의 한계

✔ !! 중요 FROM 절의 서브 쿼리는 현재 JPQL에서는 불가능 하다

    1. 조인으로 풀 수 있으면 풀어서 해결해야 한다.
    1. 쿼리를 2번 날린다.
    1. 네이티브로 해결한다.

JPA는 WHERE, HAVING 절에서만 서브쿼리 사용 가능

0개의 댓글