Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] JPQL 기본함수, 사용자 정의 함수 호출

by skahn1215 2021. 9. 25.
728x90
반응형

JPQL의 기본함수 종류

기존함수는 SQL과 동일하기 때문에 몇몇부분은 생략했습니다.

 

  • CONCAT 
  • SUBSTRING 
  • TRIM 
  • LOWER, UPPER 
  • LENGTH 
  • LOCATE 
  • ABS, SQRT, MOD 
  • SIZE, INDEX(JPA 용도)

 

CONCAT 

  • 두개의 문자를 합친다.

 

예제

// CONCAT 예제
String concatQuery = "select concat('a', 'b') as username from JPQLMember m";
List<String> concatResult = em.createQuery(concatQuery, String.class).getResultList();

for(String s : concatResult) {
    System.out.println("s = "+s);
}

 

결과

Hibernate: 
    /* select
        concat('a',
        'b') as username 
    from
        JPQLMember m */ select
            ('a'||'b') as col_0_0_ 
        from
            JPQLMember jpqlmember0_
s = ab

 

 

SUBSTRING 

  • 주어진 위치에서 원하는 숫자 만큼 문자열을 뽑는다.

예제

// SUBSTRING 예제
String subStringQuery = "select substring(m.username, 2,3) as username from JPQLMember m";
List<String> subStringResult = em.createQuery(subStringQuery, String.class).getResultList();

for(String s : subStringResult) {
    System.out.println("s = "+s);
}

 

결과

member 에서 2번째 위치부터 3개의 문자까지 가져온다.

Hibernate: 
    /* select
        substring(m.username,
        2,
        3) as username 
    from
        JPQLMember m */ select
            substring(jpqlmember0_.USER_NAME,
            2,
            3) as col_0_0_ 
        from
            JPQLMember jpqlmember0_
s = emb

 

 

 

LOCATE

  • 문자열의 위치를 반환한다.
// locate 예제
String locateQuery = "select locate('de','abcde') as username from JPQLMember m";
List<Integer> locateResult = em.createQuery(locateQuery, Integer.class).getResultList();

for(Integer s : locateResult) {
    System.out.println("s = "+s);
}

 

결과

Hibernate: 
    /* select
        locate('de',
        'abcde') as username 
    from
        JPQLMember m */ select
            locate('de',
            'abcde') as col_0_0_ 
        from
            JPQLMember jpqlmember0_
s = 4

 

 

 

SIZE

  • 컬렉션 안에 들어 있는 아이템수를 카운트한다.

예제

// SIZE
String sizeQuery = "select size(m.members) from JPQLTeam m";
List<Integer> sizeResult = em.createQuery(sizeQuery, Integer.class).getResultList();

for(Integer s : sizeResult) {
    System.out.println("s = "+s);
}

 

결과

  • 현재 members 의 list 에 3개가 들어 있다.
Hibernate: 
    /* select
        size(m.members) 
    from
        JPQLTeam m */ select
            count(members1_.TEAM_ID) as col_0_0_ 
        from
            JPQLTeam jpqlteam0_ cross 
        join
            JPQLMember members1_ 
        where
            jpqlteam0_.TEAM_ID=members1_.TEAM_ID
s = 3

 

 

 

사용자 정의 함수 호출

  • 직접 함수를 정의할수 있다.
  • dialect 를 상속받아야 한다.
  • persistence.xml에 상속받은 dialect 를 등록해줘야한다.

 

예제

이번예제에서는 group_concat 을 직접 등록해서 사용해본다.

 

 

MyH2Dialect class

package jpql.dialect;

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

// 사용하는 Dialect를 상속받는다.
public class MyH2Dialect extends H2Dialect {
    public MyH2Dialect() {
        registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
    }
}

 

persistence.xml

  • 기존 <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 를 주석처리후
  • 새로만든 dialect 를 등록해줬다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            ...
            ...
            ...
            <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> -->
            <property name="hibernate.dialect" value="jpql.dialect.MyH2Dialect"/>
            ...
            ...
            ...
            
        </properties>
    </persistence-unit>
</persistence>

 

 

 

 

 

참고:

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21726?tab=curriculum 

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] JPQL Fetch Join  (0) 2021.09.26
[JPA] JPQL 경로표현식  (0) 2021.09.26
[JPA] JPQL CASE  (0) 2021.09.25
[JPA] JPQL TYPE  (0) 2021.09.24
[JPA] JPQL 조인, 서브쿼리  (0) 2021.09.24

댓글