본문 바로가기
JPA/JPQL

[JPQL] 페이징, 조인, 서브쿼리

by yoon_seon 2023. 4. 25.

📌 페이징

  • 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

 

댓글