JAVA/JPA 학습기록

[JPA] JPQL 조건식_ Case When, COALESCE

kth990303 2021. 7. 7. 18:59
반응형

JPA 완강이 얼마 남지 않았다.

JPQL 강의를 들으면 곧 완강할 듯 하다.

최근에 우리 학교의 소그룹 멤버들을 관리할 수 있는 홈페이지를 만들어보고 싶어 구조를 대략 짜봤는데, JPA가 필수불가결일 듯 하여 JPA 기본편, 그리고 활용1편까지 빠르게 완강하기 위해 JPA 강의를 열심히 듣고 있다.

여름방학이 끝나기 전까지 JPA 활용1편, 그리고 Spring MVC 1편 완강을 목표로 달리겠다.

 

아무튼 이번 시간엔 JPQL의 조건식이 생각보다 유용할 듯 하여 앞으로 잘 참고하기 위해 포스팅하려 한다.

또한, JPQL이 무엇인지 모른다면 이전의 JPQL 포스팅을 참고하면 더 도움이 될 듯하다.

https://kth990303.tistory.com/70

 

[JPA] JPA에서 SQL 쿼리를 작성하는 방법_ JPQL

김영한님의 스프링 MVC 1편 강좌를 수강하기 전에, JPA 기본편은 완강하고 들으려고 열심히 수강하고 있다. 블로그에 가볍게 기록해보려 한다. 출처: 자바 ORM 표준 JPA 프로그래밍 - 기본편 (인프런

kth990303.tistory.com

 

출처:  자바 ORM 표준 JPA 프로그래밍 - 기본편 (인프런 김영한 강사님)


Case When 조건문

말그대로 if문 역할을 도와주는 쿼리라고 보면 된다.

예시를 들어보자.

 

수많은 회원들이 존재하며, 이 중 회원 이름이 kth990303일 땐 apple을, 이름이 aru0504일 땐 orange를 출력하는 프로그램을 만들고 싶다. 그럼 어떻게 해야 할까?

 

???: 그냥 printf나 System.out.println 떡칠하면 안되나요? ㅎㅎ

 

좋은 답변이다. 

그런데 추가조건이 걸려있다고 해보자.

 

동료개발자A: 야야, 이런 거 까지 엔티티 객체로 변환하면 이거 성능 너무 느려져.

그냥 Native Query로 처리할 수 없냐? 너 DB 잘하잖아~

 

흠... 실제로 이럴 일이 있을진 모르겠지만...,,,

뭐 아무튼 그럼 JPQL을 이용해 작성해보도록 하자.

 

이 때, Case와 When을 이용하여 작성한다.

select from Member m 으로 member를 조회했다면, 이제 member의 이름에 따라 출력하는 값을 case when으로 다르게 해보자.

그렇게 하기 위해선 case m.username으로 if문 조건을 걸고, when 'kth990303' then 'apple' 이런식으로 설정하면 된다.

Case when문이 작성이 끝났으면 end를 붙여주는 것을 절대 잊지 말자.

아래 코드를 보자.

	String query="select "+
                "case m.username "+
                "    when 'kth990303' then 'apple' "+
                "    else 'orange' "+
                "    end "+
                "from Member1 m";
        List<String> resultList = em.createQuery(query, String.class).getResultList();
        for (String s : resultList) {
            System.out.println("s = " + s);
        }
Hibernate: 
    /* select
        case m.username     
            when 'kth990303' then 'apple'     
            else 'orange'     
        end 
    from
        Member1 m */ select
            case member1x0_.USERNAME 
                when 'kth990303' then 'apple' 
                else 'orange' 
            end as col_0_0_ 
        from
            Member1 member1x0_
s = apple
s = orange

결과가 잘 나옴을 확인할 수 있다.


COALESCE

나한텐 정말 첨보는 단어여서 익숙치가 않았다.

구글링해보니 coalesce는 '합치다'라는 뜻의 영단어라고 한다. 영어 싫어

 

아무튼 이걸 사용하면 멤버변수 값이 NULL인 경우들만 따로 값을 부여해줄 수 있다.

바로 예제 코드를 보자.

참고로 이름이 NULL인 경우를 테스트하기 위해 kth990303의 이름을 memberA.setUsername(null); 코드를 통해 ULL로 변경해주고 persist 해주었다.

 

	String query="select coalesce(m.username, 'cute') from Member1 m";
        List<String> resultList = em.createQuery(query, String.class).getResultList();
        for (String s : resultList) {
            System.out.println("s = " + s);
        }
s = cute
s = aru0504

kth990303의 이름이 귀엽게 변했다.


이번엔 조건식을 살펴보았다.

다음 포스팅을 더 쓸지, 아니면 귀찮아서 안쓰고 완강 후기를 쓸지 모르겠다.

아무튼 공부를 열심히 해야겠다.

반응형