본문 바로가기
Back-end/JPA 개념

27. JPQL - 서브 쿼리 & 타입 표현

by devraphy 2022. 4. 27.

0. 개요

- 이번 포스팅에서는 JPQL에서 SubQuery와 타입 표현에 대해 알아보자.

 

 

1. 서브 쿼리(SubQuery)

a) 개념

- 서브 쿼리란, 쿼리 내부에 또 다른 쿼리를 삽입하는 형태를 말한다.

- 간단한 예시를 통해서 서브 쿼리의 형태를 살펴보자.

SELECT p FROM Player p WHERE p.age > (SELECT AVG(p2.age) FROM Player p2);

 

- 이처럼 SQL과 동일하게 JPQL에서도 서브 쿼리를 사용할 수 있다.

 

- 중요한 점은 서브 쿼리와 서브 쿼리를 포함하고 있는 쿼리는 쿼리상에서 연관 관계가 전혀 없다는 것이다.

- 즉, p와 p2는 함께 사용되지 않고 독립적인 쿼리로 사용된다.

- 이렇게 쿼리를 짜는 것이 서브 쿼리의 효율을 가장 잘 뽑아낼 수 있다는 것을 인지하자.

 

 

b) 서브 쿼리에서 지원하는 기능

- JPQL의 서브 쿼리에서는 다음과 같은 키워드를 지원한다.

 

[NOT] EXISTS (subquery): 서브 쿼리의 결과가 존재하면 참을 반환

ex) 선수가 teamA에 속해있다면 반환

SELECT p FROM Player p WHERE EXISTS (SELECT t FROM Team t WHERE t.name = "teamA");

 

 

ALL (subquery): 서브 쿼리의 결과가 모두 만족하면 참을 반환

ex) 선수의 나이가 평균 선수 나이보다 큰 경우만 반환

SELECT p FROM Player p WHERE p.age > ALL (SELECT AVG(p2.age) FROM Player p2);

 

ANY || SOME (subquery): 두 키워드는 같은 의미로, 조건을 하나라도 만족하면 참을 반환

ex) 선수가 어느 팀에라도 소속되어 있다면 반환

SELECT p FROM Player p WHERE p.team = ANY (SELECT t FROM Team t);

 

[NOT] IN (subquery): 서브 쿼리의 결과 중 하나라도 같은 것이 있다면 참을 반환 

ex) 선수가 "teamA", "teamB", "teamC" 중 하나에 속해있다면 반환

SELECT p FROM Player p WHERE p.team IN ("teamA", "teamB", "teamC");

 

 

c) JPQL의 서브 쿼리 한계점 

- JPQL은 FROM 절에서 서브 쿼리를 사용할 수 없다.

- 다음 예시를 살펴보자.

SELECT p FROM (SELECT p2 FROM Player p2 WHERE p2.age > 30) AS p;

 

- 위의 예시와 같이, JPQL에서는 FROM 절에서 서브 쿼리 또는 인라인 쿼리를 사용할 수 없다.

- FROM 절에 작성하는 서브 쿼리는 대부분 JOIN으로 해결이 가능하다.

- JOIN으로 해결할 수 없다면, Native SQL을 사용할 수밖에 없다.  

 

 

2. 타입 표현

a) JPQL에서 표현 가능한 데이터 타입 

- JPQL에서 표현할 수 있는 타입은 다음과 같다.

 

문자(String, Characters)

SELECT 'HELLO' FROM Player p;

 

숫자(Numbers): 10L(= Long), 10D(= Double), 10F(= Float)

SELECT p.name FROM Player p WHERE p.backNumber = 10L;

 

 

논리형(Boolean): TRUE, FALSE

SELECT p FROM Player p WHERE p.marriage = TRUE;

 

 

열거형(enum): jpql.PlayerType.MIDFIELD (패키지 전체 이름을 사용함)

SELECT p FROM Player p WHERE p.type = jpql.PlayerType.MIDFIELD;

 

 

Entity 타입: TYPE(i) = Book (상속 관계에서 사용함)

ex) Item 클래스를 상속받는 클래스 중에서 Book만 선택하는 경우

SELECT i FROM Item i WHERE TYPE(i) = Book;

 

- 이 외 비교 연산자(>, <, >=, <=, =), 논리 연산자(AND, OR, NOT), BETWEEN, LIKE, IS NULL 등이 있다.

'Back-end > JPA 개념' 카테고리의 다른 글

29. JPQL - 사용자 정의 함수  (0) 2022.05.02
28. JPQL - case 식  (0) 2022.04.28
26. JPQL - 조인  (0) 2022.04.26
25. JPQL - 페이징  (0) 2022.04.25
24. JPQL - 프로젝션(Projection, Select)  (0) 2022.04.22

댓글