Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

JPQL 타입과 기타식, CASE 사용 방법, JPQL의 기본함수와 사용자 설정함수
Spring/JPA기본

JPQL 타입과 기타식, CASE 사용 방법, JPQL의 기본함수와 사용자 설정함수

2021. 8. 1. 17:21

JPQL 타입 표현

  • 문자: "HELLO" 등
  • Boolean: TRUE, FALSE
  • 숫자: 10L (Long), 10D (Double), 10F (Float)
  • ENUM: jpql에서 ENUM 타입의 값을 조회할 때는 패키지명도 포함해서 작성
  • 엔티티타입: 특정 엔티티 타입으로 조회 가능하다, 예를들어 Item을 상속한 Book, Album, Movie등이 있을때
    특정 엔티티를 조회하기 위해서 엔티티타입을 이용할 수 있다.

 

예시)

 

ex) 문자, boolean, 숫자

selet m.username, "HELLO", true, 10L from Member m


ex) ENUM1 

selet m.username, 'HELLO', true from Member m 
where m.type = jpql.MemberType.ADMIN

 

위에서 "는 생략했지만 query는 String이다.

String 안에 이런식으로 패키지명 까지 하드코딩하기 싫다면 파라미터 바인딩 할 수 있다.

 


ex) ENUM2

String query = "selet m.username, 'HELLO', true from Member m 
                where m.type = :userType";
List<Object[]> result = em.createQuery(query)
                           .setParameter("userType", jpql.MemberType.ADMIN)
                           .getResultList();

:userType에 setParmeter() 메소드를 이용해서 파라미터 바인딩을 했다.

 


ex) 엔티티 타입

em.createQuery("select i from Item i where type(i) = Book", Item.class)

type() 을 황용하면 된다.

 

기타 (SQL과 문법이 같은 식)


- EXISTS, IN
- AND, OR, NOT
- =, >, >=, <, <=, <>
- BETWEEN, LIKE, IS NULL

 


CASE 식 (조건식)

 

 

1. 기본 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 str : resultList) {
                System.out.println("str = " + str);
            }

조건에 따라서 데이터를 나눠서 조회할 수 있고, 출력 결과 지정도 가능하다.

 

출력결과



2. 단순 CASE 식 (Exact 일치형)

            String query = "select " +
                               "case m.username " +
                               "when '정석우' then '노력하는자' " +
                               "else '다른사람' " +
                               "end " +
                           "from Member m";

            List<String> resultList = em.createQuery(query, String.class)
                    .getResultList();
            for (String str : resultList) {
                System.out.println("str = " + str);
            }

case에 특정 속성이 특정 값과 일치하는지 확인하고 출력결과까지 지정해주는 case 식이다.

 

출력결과

 


3. 기타 CASE 식 


COALESCE: 하나씩 조회해서 null이 이면 두번째 값 반환, null아니면 해당값 반환 
NULLIF: 두 값이 같으면 null 반환, 다르면 첫번째 값 반환

* coalesce뜻: 합치다 연합하다.

ex) COALESCE

            String query = "select coalesce(m.username, '이름이 없는 사람') from Member m";
            List<String> resultList = em.createQuery(query, String.class)
                    .getResultList();
            for (String str : resultList) {
                System.out.println("str = " + str);
            }

 

출력결과


ex) NULLIF

            String query = "select nullif(m.username, '정둘') from Member m";
            List<String> resultList = em.createQuery(query, String.class)
                    .getResultList();
            for (String str : resultList) {
                System.out.println("str = " + str);
            }


출력결과


JPQL 기본함수


CONCAT
ex) select concat('a', 'b') ..
    select 'a' || 'b' .. 와 같다

SUBSTRING
ex) substring(m.username, 1, 4) ...
-> 자바와 달리 인덱스가 0부터 시작하지 않고, 끝인덱스의 값도 포함한다.

TRIM
-> 공백제거

LOWER, UPPER
-> 소문자 대문자 교체

LENGTH

LOCATE
- locate(찾고자하는 값, 대상 인덱스)
- 리턴하는 값 형태는 Integer이고 인덱스의 첫 시작번호는 1이다. 


ex)
select locate('de', 'abcdefg') from Member m
테이블로 조회해서 4를 두번 반환

ex)
select locate('석', m.username) from Member m
만약 찾는 값이 없으면 0반환 -> 2와 0반환

ABS, SQRT, MOD

SIZE, INDEX
index는 안 쓰는걸 추천

ex)
select size(t.members) from Team t
-> 컬렉션의 크기 반환 가능


사용자 정의함수


1. Dialect 패키지를 생성하고 커스텀 함수를 생성하고 관리할 Dialect 파일을 만든다.

 

 

MyH2Dialect class

package dialect;

import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;

public class MyH2Dialect extends H2Dialect {

    public MyH2Dialect(){
        registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));

    }
}


2. 함수를 등록한다.

위와 같이 registerFunction으로 함수를 등록한다.


3. persistence의 property를 수정한다. 내가 만든 커스텀 다이얼럭트로 경로를 수정한다.

 

변경전    

<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

변경후

<property name="hibernate.dialect" value="dialect.MyH2Dialect"/>

 


이 게시물은 '자바 ORM 표준 JPA 프로그래밍' 강의를 수강하고 정리한 내용임을 밝힙니다. 
출처: https://www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

 

    'Spring/JPA기본' 카테고리의 다른 글
    • JPQL의 Update, delete 사용, 벌크연산
    • JPQL의 페치 조인 (Fetch Join)
    • JPQL 조인, 서브쿼리
    • JPQL를 통한 조회, 페이징
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바