본문 바로가기
Back-end/JPA 개념

29. JPQL - 사용자 정의 함수

by devraphy 2022. 5. 2.

0. 개요

- SQL에서 함수를 사용하듯, JPQL에서도 다양한 함수를 사용할 수 있다.

- JPA를 사용하기 때문에 DB에 종속되지 않고 JPQL에서 제공하는 다양한 함수를 사용할 수 있다.

 

- 기본 함수만을 가지고 해결하지 못하는 경우, 특정 DB에서 제공하는 함수를 가져와 사용할 수 있다.

- 이때 사용자 정의 함수를 사용한다. 

 

- 이번 포스팅에서는 JPQL이 제공하는 기본 함수와 사용자 정의 함수에 대해서 알아보자. 

 

 

1. 기본 함수 

- JPQL에서 제공하는 기본 함수는 다음과 같다. 

  → CONCAT, SUBSTRING, TRIM, LOWER, UPPER

  → LENGTH, LOCATE, ABS, SQRT, MOD, SIZE, INDEX

 

- JPQL에서 제공하는 기본 함수의 사용 방법에 대해서 간단히 알아보자.

 

 

a) 기본 함수의 사용 방법

- CONCAT은 JPQL에서 제공하는 함수로, 문자열 덧셈을 수행하는 기본 함수다.

 

- 기본 함수는 다음과 같은 방식으로 사용할 수 있다.

SELECT CONCAT('a', 'b') FROM Player p;

 

 

- Hibernate의 경우, CONCAT과 동일한 연산자를 제공한다.

SELECT 'a' || 'b' FROM Player p;

 

 

- CONCAT 대신 문자열 덧셈 연산자( || )를 사용하는 경우, IDE 측면에서 오류가 발생할 수 있다.

- 이때 다음과 같이 Uninject language 옵션을 사용하면 오류를 해제시킬 수 있다. 

오류 표시 위치에서 ALT + ENTER 입력(MAC)

 

 

- 위의 사진에서 볼 수 있듯이, 쿼리는 문자열인데 이를 IDE에서 쿼리문처럼 표현한다.

- Uninject language 옵션은 쿼리의 DML을 하이라이터로 표현하는 IDE의 기능을 제거한다.

 

- JPQL에서 제공하는 기본 함수는 이와 같은 방식으로 사용할 수 있다.

 

 

1. 사용자 정의 함수

- 특정 DB에서 제공하는 함수를 JPA에서 사용하기 위해서는 사용자 정의 함수를 사용한다.

- 그러나 사용자 정의 함수는 바로 사용할 수 없다.

- 불러온 함수가 어떤 함수인지 JPQL은 이해하지 못하기 때문이다.

 

 

a) 사용자 정의 함수 등록

- 사용자 함수를 설정하기 위해서는 현재 사용하는 Dialect를 상속받은 방언 클래스가 필요하다.

- 다음과 같이 정의할 수 있다. 

package dialect;

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

public class CustomDialect extends H2Dialect {

    public CustomDialect() {
        registerFunction("add_chars", new StandardSQLFunction("concat", StandardBasicTypes.STRING));
    }
}

 

- 위의 방언 클래스는 CONCAT 함수를 add_chars라는 이름으로 사용자 함수를 등록한 것이다.

- 이와 같은 형식으로 사용자 정의 함수를 등록할 수 있다.

 

- 사용자 정의 함수의 형태가 더 궁금하다면 현재 사용하는 방언 클래스의 코드를 살펴보기를 권장한다.

- 현재 사용 중인 H2Dialect 클래스의 내부를 살펴보면 다음과 같다.

 

- 위의 사진처럼, JPQL에서 제공하는 기본 함수도 사용자 정의 함수로 등록되어있는 것을 확인할 수 있다. 

 

 

b) persistence.xml 설정

- 사용자 정의 함수를 등록했다면, 이제 이를 프로젝트에서 사용할 수 있도록 적용해야 한다.

- 이는 persistence.xml을 통해 설정할 수 있다.

 

 

c) 사용자 정의 함수 사용

- 이제 사용자 정의 함수를 사용해보자. 다음과 같은 형식으로 사용할 수 있다.

String query = "select function('add_chars', 'a', 'b') from Player p";
List<String> resultList = em.createQuery(query, String.class).getResultList();

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

 

- 위의 사진과 같이 결과가 잘 나오는 것을 확인할 수 있다.

'Back-end > JPA 개념' 카테고리의 다른 글

31. JPQL - Fetch Join 개념  (0) 2022.05.04
30. JPQL - 경로 표현식과 묵시적 JOIN  (0) 2022.05.03
28. JPQL - case 식  (0) 2022.04.28
27. JPQL - 서브 쿼리 & 타입 표현  (0) 2022.04.27
26. JPQL - 조인  (0) 2022.04.26

댓글