반응형
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
조건식(CASE 등)
기본 CASE 식
select
case when m.age <= 10 then '학생요금'
when m.age >= 60 then '경로요금'
else '일반요금'
end
from Member m
기본 CASE 식은 컨디션에 대한 조건을 넣을 수 있는 CASE 식이다. 위의 예제를 인텔리제이에서 적어보면 아래와 같다.
String query = "select " +
"case when m.age <= 10 then '학생요금' " +
" when m.age >= 60 then '경로요금' " +
" else '일반요금' " +
"end " +
"from Member m";
List<String> resultList = em.createQuery(query, String.class).getResultList();
for (String s : resultList) {
System.out.println("s = " + s);
}
참고로 query는 String이므로 띄어쓰기에 아주 주의를 기울여야한다. 전 키워드와 다음 키워드 사이에 띄어쓰기를 잘 했는지 확인해가면서 작성하자.
그리고 member의 나이를 10으로 세팅해주고 실행해보자.
member.setAge(10);
// 출력 로그
Hibernate:
/* select
case
when m.age <= 10 then '학생요금'
when m.age >= 60 then '경로요금'
else '일반요금'
end
from
Member m */ select
case
when member0_.age<=10 then '학생요금'
when member0_.age>=60 then '경로요금'
else '일반요금'
end as col_0_0_
from
Member member0_
s = 학생요금 //** CASE 식으로 인해 학생 요금이 출력된다.
단순 CASE 식
select
case t.name
when '팀A' then '인센티브110%'
when '팀B' then '인센티브120%'
else '인센티브105%'
end
from Team t
단순 CASE식은 조건이 아니라 정확하게 일치하면 어떤 것을 하라는 CASE 식이다.
조건식 - CASE 식
- COALESCE : 하나씩 조회해서 null이 아니면 반환
- NULLIF : 두 값이 같으면 null 반환, 다르면 첫번째 값 반환
- 사용자 이름이 없으면 이름 없는 회원을 반환
member의 이름을 null로 세팅해준다.
member.setUsername(null);
그리고 쿼리를 아래와 같이 작성하고 실행해보자.
String query = "select coalesce(m.username, 'NO NAME') from Member m ";
List<String> resultList = em.createQuery(query, String.class).getResultList();
for (String s : resultList) {
System.out.println("s = " + s);
}
Hibernate:
/* select
coalesce(m.username,
'NO NAME')
from
Member m */ select
coalesce(member0_.username,
'NO NAME') as col_0_0_
from
Member member0_
s = NO NAME //** NO NAME 출력
- 사용자 이름이 '관리자'면 null을 반환하고, 나머지는 본인의 이름을 반환
이번에는 member의 이름을 Admin으로 세팅해준다.
member.setUsername("Admin");
그리고 아래 쿼리를 작성하고 실행해보자.
String query = "select nullif(m.username, 'Admin') from Member m ";
List<String> resultList = em.createQuery(query, String.class).getResultList();
for (String s : resultList) {
System.out.println("s = " + s);
}
Hibernate:
/* select
nullif(m.username,
'Admin')
from
Member m */ select
nullif(member0_.username,
'Admin') as col_0_0_
from
Member member0_
s = null //** Admin이라 null이 출력 된다.
반응형