본문 바로가기

Spring/JPA

JPA- 조건식의 사용

조건식 문법

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가 어떤 값 이상이냐에 따라서 문자열이 반환되는 구조로 이루어져 있다.  

  1. member1은 9살이므로 학생 요금에 해당하여 "학생요금" 문자열이 반환된다.
  2. member2은 40살이므로 일반 요금에 해당하여 "일반요금" 문자열이 반환된다.
  3. 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