코드 그라데이션

조건식 본문

Database/JPQL

조건식

완벽한 장면 2023. 8. 31. 19:19

조건식 - CASE 식


 

학생요금 / 경로요금 예제 (기본 CASE 식)

JpqlMain

쿼리 식을 따로 떼서 보면 이렇다

String query =
    "select " +
        "case when m.age <= 10 then '학생요금' " +
        "     when m.age >= 60 then '경로요금' " +
        "     else '일반요금' " +
        "end " +
    "from Member m";

 

전체 코드는

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      // 팀 먼저 저장
      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);

      Member member = new Member();
      member.setUsername("member1");
      member.setAge(10);
      member.setType(MemberType.ADMIN); // 여기 추가
      em.persist(member);

      member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.

      em.flush();
      em.clear(); // 비움

      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();
      for (String s : result) {
        System.out.println("s = " + s);
      }

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

실행해보면

왜? setAge를 10으로 했기 때문에!

 


단순 CASE 식 - 인센티브 예제

JpaMain

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      // 팀 먼저 저장
      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);

      Member member = new Member();
      member.setUsername("member1");
      member.setAge(10);
      member.setType(MemberType.ADMIN); // 여기 추가
      em.persist(member);

      member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.

      em.flush();
      em.clear(); // 비움

      String query =
          "select " + "case t.name "
              + "when 'TeamA' then '인센티브 110%' "
              + "when 'TeamB' then '인센티브 120%' "
              + "else '인센티브 105%' "
              + "end "
              + "from Team t";

      List<String> result = em.createQuery(query, String.class)
          .getResultList();
      for (String s : result) {
        System.out.println("s = " + s);
      }

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

 

쿼리식만 빼서 다시한번 적으면

      String query =
          "select " + "case t.name "
              + "when 'TeamA' then '인센티브 110%' "
              + "when 'TeamB' then '인센티브 120%' "
              + "else '인센티브 105%' "
              + "end "
              + "from Team t";

 

실행해보면

위에서 TeamA로 적었으므로.

 


조건식 - CASE 식 (2)

 

바로 예시

이름 없는 회원을 위해 .setUsername() 주석처리

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      // 팀 먼저 저장
      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);

      Member member = new Member();
//      member.setUsername("member1"); 빼버림 요기
      member.setAge(10);
      member.setType(MemberType.ADMIN); 
      em.persist(member);

      member.setTeam(team); 

      em.flush();
      em.clear(); // 비움


      String query = "select coalesce(m.username, '이름 없는 회원') from Member m";
      List<String> result = em.createQuery(query, String.class)
          .getResultList();
      for (String s : result) {
        System.out.println("s = " + s);
      }

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

실행 결과


사용자 이름이 관리자면 예시

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      // 팀 먼저 저장
      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);

      Member member = new Member();
//      member.setUsername("member1"); 빼버림
      member.setUsername("관리자");
      member.setAge(10);
      member.setType(MemberType.ADMIN); // 여기 추가
      em.persist(member);

      member.setTeam(team); // 연관관계 편의 메서드 만들러 Member 다녀옴.

      em.flush();
      em.clear(); // 비움


//      String query = "select coalesce(m.username, '이름 없는 회원') from Member m";
      String query = "select NULLIF(m.username, '관리자') from Member m";
      List<String> result = em.createQuery(query, String.class)
          .getResultList();
      for (String s : result) {
        System.out.println("s = " + s);
      }

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

실행하면

null 반환

 

이름 세팅을

member.setUsername("뉴진스"); 로 

바꾸면

 

실행 결과

자기 이름ㅇ 출력됨을 확인 가능

728x90

'Database > JPQL' 카테고리의 다른 글

경로 표현식  (0) 2023.09.01
JPQL 함수들  (0) 2023.09.01
JPQL 타입 표현  (0) 2023.08.31
서브 쿼리  (0) 2023.08.31
조인 (2) - ON 절  (0) 2023.08.30
Comments