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 |
댓글