✏️ [JPQL] 조건식

박상민·2023년 10월 29일
0

JPA

목록 보기
18/24
post-thumbnail

⭐️ 조건식


조건식은 기본 CASE 식과 조건 CASE 식으로 나뉜다.
마치 자바의 스위치 케이스문과 비슷하다.

기본 CASE 식 예시

Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member = new Member();
member.setUsername("teamA");
member.setAge(10);
member.setType(MemberType.ADMIN);

member.setTeam(team);

em.persist(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();

///출력///
s = 학생요금

기본 CASE 식에서 회원의 나이가 10살 이하이면 '학생요금', 60세 이상이면 '경로요금', 둘 모두 해당하지 않는다면 '일반요금'이 되도록 작성했다.
회원의 나이를 10살로 설정했기에 출력문에서 '학생요금'이 나온다.


또한 Coalesce와 Nullif 식도 존재한다.

  • Coalesce: 하나씩 조회해서 null이 아니면 반환
//사용자 이름이 없으면 '이름 없는 회원'을 반환
select coalesce(m.username, '이름 없는 회원') from Member m
  • Nullif: 두 값이 같으면 null 반환, 다르면 첫번째 값 반환
//사용자 이름이 '관리자'면 null을 반환하고 나머지는 본인의 이름을 반환
select NULLIF(m.username, '관리자') from Member m

Coalesce 예시

member.setUsername(null);

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();

///출력///
s = 이름 없는 회원

Coalesce 식은 m.username이 존재하지 않으면 '이름 없는 회원'을 반환한다.
회원의 이름을 Null로 설정했기 때문에 출력문에서 '이름 없는 회원'이 반환된다.

Nullif 예시

member.setUsername('관리자');

String query = "select coalesce(m.username, '관리자') from Member m";
List<String> result = em.nullif(query, String.class)
        .getResultList();
for (String s : result) {
    System.out.println("s = " + s);
}

tx.commit();

///출력///
s = null

Nullif 식은 두 값이 같으면 null을 반환한다. 예시에서 회원의 이름을 '관리자'로 설정했고 Nullif 식도 '관리자'로 설정했기 때문에 두 값이 같아서 null이 출력된다.


출처
자바 ORM 표준 JPA 프로그래밍 강의
게시글 속 자료는 모두 위 강의 속 자료를 사용했습니다.

profile
스프링 백엔드를 공부중인 대학생입니다!

0개의 댓글