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

2022. 7. 18. 22:28·공부/JPA
반응형

출처 : 자바 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이 출력 된다.

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • JPA 객체지향 쿼리 언어(JPQL) - 경로 표현식
  • JPA 객체지향 쿼리 언어(JPQL) - JPQL 함수
  • JPA 객체지향 쿼리 언어(JPQL) - JPQL 타입 표현과 기타식
  • JPA 객체지향 쿼리 언어(JPQL) - 서브 쿼리
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    QueryDSL
    스프링부트
    개발자
    egov
    전자정부프레임워크
    springboot
    Java
    RESTful
    JPA
    oracle
    자바스크립트
    코딩테스트
    인프런
    알고리즘
    프로그래머스
    운영체제
    SQL
    IT
    프론트엔드
    넥사크로
    MSA
    백준
    react
    SpringBoot를 이용한 RESTful Web Service 개발
    토이프로젝트
    Spring
    방통대
    에러해결
    기출문제
    토비의스프링부트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
JPA 객체지향 쿼리 언어(JPQL) - 조건식(CASE 등)
상단으로

티스토리툴바