본문 바로가기
JPA/JPA

[JPA] JPQL - 조건식

by 걸어가는 신사 2022. 1. 8.

1. 타입 표현

  • JPQL에서 사용하는 타입은 대소문자를 구분하지 않는다.
종류 설명 예제
문자 작은 따옴표 사이에 표현
작은 따옴표를 표현하고 싶으면 작은 따옴표 연속 두 개('') 사용
'HELLO'
"She''s '
숫자 L(Long 타입 지정)
D(Double 타입 지정)
F(Float 타입 지정)
10L
10D
10F
날짜 DATE {d 'yyyy-mm-dd'}
TIME {t 'hh-mm-ss'}
DATETIME {ts 'yyyy-mm-dd hh:mm:ss.f'}
{d '2012-03-24'}
{t '10-11-11'}
{ts '2012-03-24 10-11-11.123'}
m.createDate = {d '2012-03-24'}
Boolean TRUE, FALSE  
Enum 패키지명을 포함한 전체 이름을 사용해야 한다. jpabook.MemberType.Admin
엔티티 타입 엔티티의 타입을 표현한다. 주로 상속과 관련해서 사용한다. TYPE(m) = Member

 

2. 연산자 우선순위

(1) 경로 탐색 연산

  • ( . )

(2) 수학 연산

  • +, -(단항 연산자), *, /, +, -

(3) 비교 연산

  • =, >, >=, <, <=, <>(다름)
  • [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF], [NOT] EXISTS

(4) 논리 연산

  • NOT, AND, OR

 

3. 논리 연산과 비교식

(1) 논리 연산

  • AND : 둘 다 만족하면 참
  • OR : 둘 중 하나만 만족해도 참
  • NOT : 조건식의 결과 반대

(2) 비교식

  • = | > | >= | < | <= | <>

 

4. 연산자

(1) Between

  • 문법 : x [NOT] BETWEEN A AND B
  • 설명 : X는 A~B 사이의 값이면 참 (A, B 값 포함)
select m from Member m where m.age between 10 and 20

(2) IN

  • 문법 : X [NOT] IN Y
  • 설명 : X와 같은 값이 Y에 하나라도 있으면 참이다. IN 식의 예제에는 서브 쿼리를 사용할 수 있다.
select m from Member m where m.username in ('member1', 'member2')

(3) LIKE

  • 문법 : 문자 표현식 [NOT] LIKE 패턴 값 [ESCAPE 이스케이프 문자]
  • 설명 : 문자 표현식과 패턴 값을 비교한다.
  • 패턴
    • % : 아무 값들이 입력되어도 된다. (값이 없어도 된다.)
    • _ : 한 글자는 아무 값이 입력되어도 되지만 값이 있어야 한다.
// (1) (좋은회원, 회원, 원)
select m from Member m where m.username like '%원%'

// (2) (회원1, 회원ABC)
select m from Member m where m.username like '회원%'

// (3) (좋은 회원, A회원)
select m from Member m where m.username like '%회원'

// (4) (회원A, 회원1)
select m from Member m where m.username like '회원_'

// (5) (회원3)
select m from Member m where m.username like '__3'

// (6) (회원%)
select m from Member m where m.username like '회원\%' ESCAPE '\'

(4) NULL 비교

  • 문법 : {단일 값 경로 | 입력 파라미터 } IS [NOT] NULL
  • 설명 : NULL 인지 비교한다. NULL은 =비교하면 안 되고 꼭 IS NULL을 사용해야 한다.
select m from Member m where m.username is null
select m from Member m where m.username = null // 불가능

(5) 빈 컬렉션 비교 식

  • 문법 : {컬렉션 값 연관 경로} IS [NOT] EMPTY
  • 설명 : 컬렉션에 값이 비었으면 참
select m from Member m where m.orders is not empty

(6) 컬렉션의 멤버 식

  • 문법 : {엔티티 or  값} [NOT] MEMBER [OF] { 컬렉션 값 연관 경로 }
  • 설명 : 엔티티나 값이 컬렉션에 포함되어 있으면 참
select t from Team t where :memberParam member of t.members
(5), (6) 컬렉션 식은 컬렉션에만 사용하는 특별한 기능이다.
또한 컬렉션은 컬렉션 식 이외에 다른 식은 사용할 수 없다.

 

5. 스칼라 식

  • 스칼라는 숫자, 문자, 날짜, case, 엔티티(엔티티의 타입 정보) 같은 가장 기본적인 타입들을 말한다.

(1) 수학 식

  • +, - : 단항 연산자
  • *, /, +, - : 사칙 연산

(2) 문자 함수

함수 설명 예제
CONCAT(문자1, 문자2, ....) 문자를 합한다. CONCAT('A', 'B') = AB
SUBSTRING(문자, 위치, [길이]) 위치부터 시작해 길이만큼 문자를 구한다.
길이 값이 없으면 나머지 전체 길이를 뜻한다.
SUBSTRING('ABCDEF', 2, 3) = BCD
TRIM([[LEADING | TRAILING | BOTH] [trim 문자] FROM] 문자) LEADING : 왼쪽만
TRAILING : 오른쪽만
BOTH : 양쪽 다 트림 문자를 제거한다.
기본값은 BOTH. 트림 문자의 기본값은 공백(SPACE)이다.
TRIM(' ABC ') = 'ABC'
LOWER(문자) 소문자로 변경 LOWER('ABC') = 'abc'
UPPER(문자) 대문자로 변경 UPPER('abc') = 'ABC'
LENGTH(문자) 문자 길이 LENGTH('ABC') = 3
LOCATE(찾을 문자, 원본 문자, [검색시작위치]) 검색위치부터 문자를 검색한다.
1부터 시작, 못 찾으면 0 반환
LOCATE('DE', 'ABCDEFG') = 4

(3) 수학 함수

함수 설명 예제
ABS(수학식) 절대값을 구한다. ABS(-10) = 10
SQRT(수학식) 제곱근을 구한다. SQRT(4) = 2.0
MOD(수학식, 나눌 값) 나머지를 구한다. MOD(4,3) = 1
SIZE(컬렉션 값 연관 경로식) 컬렉션의 크기를 구한다. SIZE(t.members)
INDEX(별칭) LIST 타입 컬렉션의 위치값을 구한다.
단 컬렉션이 @OrderColumn을 사용하는 LIST 타입일 때만 사용할 수 있다.
t.members m where INDEX(m) > 3

(4) 날짜 함수

  • 데이터베이스의 현재 시간을 조회한다.
  • CURRENT_DATE : 현재 날짜
  • CURRENT_TIME :  현재 시간
  • CURRENT_TIMESTAMP : 현재 날짜 시간
select CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP from Team t
//결과 2013-08-19, 23:38:17, 2013-08-19 23:38:17.736

select e from Event e where e.endDate < CURRENT_DATE

 

6. CASE 

  • 특정 조건에 따라 분기할 때 CASE 식을 사용한다.

(1) 기본 CASE

문법 :
CASE
	{ WHEN <조건식> THEN <스칼라식> } +
    ELSE <스칼라식>
END

예시 : 
select
	case when m.age <= 10 then '학생요금'
         when m.age >= 60 then '경로요금'
    end
from Member m

(2) 심플 CASE

  • 조건식을 사용하지 않는다.
문법 :
CASE <조건대상>
	{WHEN <스칼라식1> THEN <스칼라식2>} +
    ELSE <스칼라식>
END

예시 :
select
	case t.name
    	when '팀A' then '인센티브110%'
        when '팀B' then '인센티브120%'
        else '인센티브105%'
    end
from Team t

(3) COALESCE

  • 문법 : COALESCE (<스칼라식> {,<스칼라식>}+)
  • 설명 : 스칼라식을 차례대로 조회해서 null이 아니면 반환한다.
select coalesce(m.username, '이름 없는 회원') from Member m
//사용자 이름이 없으면 '이름 없는 회원' 반환

(4) NULLIF

  • 문법 : NULLIF(<스칼라식>, <스칼라식>)
  • 설명 : 두 값이 같으면 null을 반환하고 다르면 첫 번째 값을 반환한다. 집합 함수는 null을 포함하지 않으므로 보통 집합 함수와 함께 사용한다.
select NULLIF(m.username, '관리자') from Member m
//사용자 이름이 '관리자'면 null을 반환하고 나머지는 본인의 이름을 반환
반응형

댓글