728x90
조인
내부 조인:
SELECT m From Member m [INNER] JOIN m.team t
외부 조인:
SELECT m From Member m LEFT [OUTER] JOIN m.team t
세타 조인(cross join):
select count(m) from Member m, Team t where m.username = t.name
조인 - ON절
1. 조인 대상 필터링
예) 멤버와 팀을 조인하면서, 팀 이름이 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'
2. 연관관계 없는 엔티티 외부 조인
예) 회원의 이름과 팀의 이름이 같은 대상 외부 조인
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
서브 쿼리
쿼리 안의 쿼리
예1) 나이가 평균보다 많은 회원
select m from Member m
where m.age > (select avg(m2.age) from Member m2)
예2) 한 건이라도 주문한 고객
select m from Member m
where (select count(o) from Order o where m = o.member) > 0
서브 쿼리 지원 함수
- [NOT] EXISTS (subquery): 서브 쿼리에 결과가 존재하면 참
- [ALL | ANY | SOME] (subquery)
- ALL 모두 만족하면 참
- ANY, SOME: 조건을 하나라도 만족하면 참
- [NOT] IN (subquery): 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참
예1) 팀 A 소속인 회원
select m from Member m
where exists (select t from m.team t where t.name = ‘팀A')
예2) 전체 상품 각각의 재고보다 주문량이 많은 주문들
select o from Order o
where o.orderAmount > ALL (select p.stockAmount from Product p)
예3) 어떤 팀이든 팀에 소속된 회원
select m from Member m
where m.team = ANY (select t from Team t)
JPA 서브 쿼리 한계
- JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능
- SELECT 절도 가능(하이버네이트에서 지원)
- 하이버네이트6 이전까지는 FROM 절의 서브 쿼리 불가능 - 조인으로 풀 수 있으면 풀어서 해결하기
- 하이버네이트6부터 FROM절의 서브쿼리를 지원
- 참고 링크: https://in.relation.to/2022/06/24/hibernate-orm-61-features/
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
JPA | JPQL 중급 문법 뿌시기 - 경로 표현식, 명시적 조인 vs 묵시적 조인 (0) | 2023.05.04 |
---|---|
JPA | JPQL 문법 뿌시기 - 타입 표현, 조건식, 기본 함수 (0) | 2023.05.04 |
JPA | JPQL 문법 뿌시기 - 프로젝션(SELECT), 페이징 API (0) | 2023.05.03 |
JPA | JPQL 문법 뿌시기 - 기본 문법, 쿼리 API (0) | 2023.05.03 |
JPA | 객체지향 쿼리 언어 간단 소개 (JPQL, Criteria, QueryDSL 등) (0) | 2023.05.02 |