현의 개발 블로그

[JPQL 문법] 프로젝션, 조인, 서브쿼리 본문

스프링부트 이론/JPA

[JPQL 문법] 프로젝션, 조인, 서브쿼리

hyun2371 2023. 8. 2. 20:27

프로젝션

프로젝션은 SELECT 절에 조회할 대상을 지정하는 것이다.

프로젝션 대상

엔티티 프로젝션

List<Member> result = 
	em.createQuery("select m from Member m", Member.class)
	.getResultList(); //영속성 컨텍스트에서 관리됨

Member findMember = result.get(0);
findMember.setAge(20);

 

임베디드 타입 프로젝션

em.createQuery("select o.address from Order o",Address.class)
								.getResultList();

 

스칼라 타입 프로젝션

스칼라 타입은 숫자, 문자 등 기본 데이터 타입을 의미한다.

DISTINCT로 중복을 제거할 수 있다.

em.createQuery("select distinct m.username, m.age from Member m")
							.getResultList();

 

 

조인

- 내부 조인

  공통 속성의 값이 같은 것만 결과로 추출한다.

  SELECT m FROM Member m [INNER] JOIN m.team t

 

- 외부 조인

  LEFT OUTER JOIN은 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 데이터를 매핑한다.

  SELECT m FROM Member m LEFT [OUTER] JOIN m.team t

 

 

- 세타 조인

  두 객체간 연관관계가 없을 때 조인이 가능하다.

  SELECT m FROM Member m, Team t where m.username = t.name

 

 

 

ON절을 활용한 조인

아래는 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인하는 예제이다.

SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'

 

서브 쿼리

예시

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

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

 

서브쿼리 지원 함수

[NOT] EXIST (subquery): 서브쿼리에 결과가 존재하면 참이다.

{ALL | ANY | SOME} (subquery)

- ALL: 모두 만족하면 참이다.

- ANY, SOME: 조건을 하나라도 만족하면 참이다.

 

서브쿼리 지원 함수 예제

팀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 서브 쿼리 한계

FROM 절 서브쿼리는 현재 JPQL에서 불가능하므로 조인으로 풀어서 해결해야 한다.

 

 


Reference

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com

 

Comments