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 옵션을 사용하면 오류를 해제시킬 수 있다.
- 위의 사진에서 볼 수 있듯이, 쿼리는 문자열인데 이를 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 |
댓글