CASE 문
일반적으로 case문을 통해서 어떠한 결과를 가져올지 구분을 한다. jpql도 case 문을 지원하기에 다음과 같이 사용이 가능하다.
package jpql;
public class JpqlMain {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member1 = new Member("a", 9);
Member member2 = new Member("b", 40);
Member member3 = new Member("c", 66);
em.persist(member1);
em.persist(member2);
em.persist(member3);
String query =
"select " +
"case when m.age<=10 then '학생요금' " +
"when m.age>=60 then '경로요금' " +
"else '일반요금' " +
"end " +
"from Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
em.flush();
em.clear();
int i =1;
for (String s : result) {
System.out.println("member" + i++ + ": " + s);
}
tx.commit();
} catch (Exception e) {
tx.rollback(); // 오류 발생 시 롤백
e.printStackTrace(); // 에러 내용 출력
} finally {
em.close(); // 종료
}
emf.close();
}
}
출력>>>
member1: 학생요금
member2: 일반요금
member3: 경로요금
case 문의 쿼리 문을 보면 "select case [ when (조건식) then (결과) ] [ else (결과) ] end from (엔티티)"의 구조로 이루어져 있다. (여기서 [ ]는 내부 문장이 0회 이상 반복을 의미한다.) 위 예시의 경우 Member m의 age가 어떤 값 이상이냐에 따라서 문자열이 반환되는 구조로 이루어져 있다.
- member1은 9살이므로 학생 요금에 해당하여 "학생요금" 문자열이 반환된다.
- member2은 40살이므로 일반 요금에 해당하여 "일반요금" 문자열이 반환된다.
- member3은 66살이므로 경로 요금에 해당하여 "경로요금" 문자열이 반환된다.
지금은 예시를 기본 케이스 식으로 들었지만 단순 케이스식도 똑같다. 단순 케이스식은 case문의 조건과 인자가 매칭이 된다면 해당 값이 반환되는 것 뿐이다.
COALESCE
select coalesce(m.username,'이름 없는 회원') from Member m
coalesce(인자, null 반환값)
- null이 아니면 인자 반환.
- null이라면 null 반환 값을 반환.
package jpql;
public class JpqlMain {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member1 = new Member("a", 9);
Member member2 = new Member("b", 40);
Member member3 = new Member("c", 66);
Member member4 = new Member(); // member4.username == null
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
// m.username을 조회해서 null이 아니라면 m.username 반환
// null이라면 "이름없는 회원" 반환
String query = "select coalesce(m.username,'이름없는 회원') from Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
em.flush();
em.clear();
int i =1;
for (String s : result) {
System.out.println("member" + i++ + ": " + s);
}
tx.commit();
} catch (Exception e) {
tx.rollback(); // 오류 발생 시 롤백
e.printStackTrace(); // 에러 내용 출력
} finally {
em.close(); // 종료
}
emf.close();
}
}
결과>>>
member1: a
member2: b
member3: c
member4: 이름없는 회원
NULLIF
select nullif(m.username,'admin') from Member m;
nullif(var, target)
- var 조회시 값이 target이라면 null 반환
- var 조회시 값이 target이 아니라면 var의 값을 반환
package jpql;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
import java.util.Scanner;
public class JpqlMain {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member1 = new Member("a", 9);
Member member2 = new Member("admin", 40);
em.persist(member1);
em.persist(member2);
String query = "select nullif(m.username, 'admin') from Member m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
em.flush();
em.clear();
int i =1;
for (String s : result) {
System.out.println("member" + i++ + ": " + s);
}
tx.commit();
} catch (Exception e) {
tx.rollback(); // 오류 발생 시 롤백
e.printStackTrace(); // 에러 내용 출력
} finally {
em.close(); // 종료
}
emf.close();
}
}
출력>>>
member1: a
member2: null
위의 예시에서는 m.username이 "admin"인 경우 null을 반환하고 아니라면 m.username의 값을 그대로 반환한다.
'Spring > JPA' 카테고리의 다른 글
JPA-Join Fetch (0) | 2023.06.18 |
---|---|
JPA- 경로 표현식 (0) | 2023.06.18 |
JPA-타입 표현 (0) | 2023.05.20 |
JPA- 조인 (0) | 2023.05.14 |
JPA- 페이징 (0) | 2023.05.13 |