조건식은 기본 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 식도 존재한다.
//사용자 이름이 없으면 '이름 없는 회원'을 반환
select coalesce(m.username, '이름 없는 회원') from Member m
//사용자 이름이 '관리자'면 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 프로그래밍 강의
게시글 속 자료는 모두 위 강의 속 자료를 사용했습니다.