공부/JPA

JPA 객체지향 쿼리 언어(JPQL) - 조건식(CASE 등)

데부한 2022. 7. 18. 22:28
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

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이 출력 된다.

 

반응형