📌 페이징
- JPA는 페이징을 다음 두 API로 추상화
- setFirstResult(int startPosition) : 조회 시작 위치(0부터 시작)
- setMaxResults(int maxResult) : 조회할 데이터 수
List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(1) // 0부터
.setMaxResults(10) // 10개씩
.getResultList();
연결된 데이터베이스 별 SQL이 작성되기 때문에 매우 편리하다.
📌 조인
내부조인(Inner Join)
SELECT m FROM Member m [INNER] JOIN m.team t
외부조인(Outer Join)
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
세타조인 = 연관관계가 아에 없을 때
select count(m) from Member m, Team t where m.username = t.name
조인 - ON 절
ON절을 활용한 조인(JPA 2.1부터 지원)
1. 조인 대상 필터링
ex) 회원과 팀을 조인하면서 팀 이름이 A인 팀만 조인
- JPQL : SELECT m, t FROM Member m JOIN m.team t on t.name = 'A'
- SQL :
SELECT * FROM Member m LEFT JOIN Team t ON m.Team_id = t.id AND t.name = 'A'
2. 연관관계 없는 외부 조인(Hibernate 5.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.username
📌 서브쿼리
ex) 나이가 평균보다 많은 회원
select m from Member m
where m.age > (select avg(m2.age) from Member m2)
ex) 한건이라도 주문한 고객
select m from Member m
where (select count(o) from Order o where m = o.member) > 0
서브 쿼리 지원 함수
- [NOT] EXISTS (subquery) : 서브쿼리에 결과가 존재하면 참
- {ALL | ANU | SOME}(subquery)
- ALL : 모두 만족하면 참
- ANY, SOME : 같은 의미, 조건을 하나라도 만족하면 참
- [NOT] IN(subquery) : 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참
예제
- 팀A 소속인 회원
select m from Member m
where exists (select t from m.team t where t.name = '팀A')
- 전체 상품 각각의 재고보다 주문량이 많은 주문들
select o from Order o
where o.orderAmount > ALL(select p.stockAmount from Product p)
- 어떤 팀이든 팀에 소속된 회원
select m from Member m
where m.team = ANY(select t from Team t)
JPA 서브 쿼리 한계
- JPA는 WHERE, HAVING절에서만 서브 쿼리 사용 가능
- SELECT도 가능(하이버네이트에서 지원)
- FROM 절의 서브 쿼리는 현재 JPQL에서 불가능(조인으로 풀 수 있으면 풀어서 해결)
해당 글은 인프런의 [자바 ORM 표준 JPA 프로그래밍 - 기본편] 강의를 정리한 내용입니다.
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'JPA > JPQL' 카테고리의 다른 글
[JPQL] 다형성 쿼리, 엔티티 직접 사용, Named 쿼리, 벌크 연산 (0) | 2023.04.26 |
---|---|
[JPQL] 경로 표현식, 페치 조인(N+1문제 해결) (1) | 2023.04.26 |
[JPQL] 타입 표현과 기타식, 조건식(CASE 등등), 기타 함수 (0) | 2023.04.25 |
[JPQL] 객체지향 쿼리 언어 소개 및 JPQL 기본 문법 (0) | 2023.04.25 |
[JPQL] 프로젝션(SELECT) (0) | 2023.04.25 |
댓글