본문 바로가기

JPA

JPQL의 내장함수와 사용자 정의 함수

JPQL에서 제공하는 기본함수

  1. COUNT
    • 결과 집합의 개수를 반환.
    • 예) "SELECT COUNT(e) FROM Employee e"
  2. SUM
    • 숫자 필드의 합계 계산.
    • 예) "SELECT SUM(e.salary) FROM Employee e"
  3. AVG
    • 숫자 필드의 평균 값을 계산.
    • 예) "SELECT AVG(e.salary) FROM Employee e"
  4. MAX
    • 숫자나 날짜 필드의 최댓값을 반환.
    • 예) "SELECT MAX(e.salary) FROM Employee e"
  5. MIN
    • 숫자나 날짜 필드의 최솟값을 반환.
    • 예) "SELECT MIN(e.salary) FROM Employee e" 
  6. DISTINCT
    • 중복된 결과를 제거.
    • 예) "SELECT DISTINCT e.department FROM Employee e"
  7. UPPER
    • 문자열을 대문자로 변환.
    • 예) "SELECT UPPER(e.name) FROM Employee e"
  8. LOWER
    • 문자열을 소문자로 변환.
    • 예) "SELECT LOWER(e.name) FROM Employee e"
  9. CONCAT
    • 문자열을 연결
    • 예) "SELECT CONCAT(e.firstName, ' ', e.lastName) FROM Employee e" 
  10. TRIM
    • 문자열의 양쪽 끝에 있는 공백을 제거
    • 예) "SELECT TRIM(e.name) FROM Employee e"
  11. SUBSTRING
    • 문자열의 일부분을 추출
    • 예) "SELECT SUBSTRING(e.name, 1, 3) FROM Employee e"
  12. LENGTH
    • 문자열의 길이를 반환
    • 예) "SELECT LENGTH(e.name) FROM Employee e"
  13. CURRENT_DATE
    • 현재 날짜를 반환
    • 예) "SELECT e FROM Employee e WHERE e.startDate >= CURRENT_DATE" 
  14. CURRENT_TIME
    • 현재 시간을 반환
    • 예) "SELECT e FROM Employee e WHERE e.startTime <= CURRENT_TIME" 
  15. CURRENT_TIMESTAMP
    • 현재 날짜와 시간을 반환
    • 예) "SELECT e FROM Employee e WHERE e.createdOn <= CURRENT_TIMESTAMP"

만약, 위의 JPQL이 제공하는 기본 함수로도 부족하다면? 

➡️ 사용자 정의 함수 !

사용자 정의 함수 호출하기

자신이 만들어 둔 함수를 먼저 등록 후, 호출해야한다.

 

1. 자신이 사용하는 DB 다이어렉트를 상속받는 새로운 다이어렉트를 정의

public class CustomH2Dialect extends H2Dialect {
	
    //생성자
	public CustomH2Dialect() {
    	
    }
	
}

 

2. 새로운 다이어렉트의 생성자 내부에 자신이 만든 함수들을 명시

public class CustomH2Dialect extends H2Dialect {
	
    //생성자
	public CustomH2Dialect() {
        registerFunction("불러올 함수 이름", new StandardSQLFunciton("내가 호출할 함수 이름", StandardBasicTypes.STRING));
    }
	
}

만약 DB의 "A"라는 함수를 "B"로 불러와서 사용하고 싶다면? 아래처럼!
➡️ registerFunction("A", new StandardSQLFunciton("B", StandardBasicTypes.STRING));

 

3. persistence.xml의 프로퍼티 수정

persistence.xml

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

// 새로만든 다이어렉트로 수정!
<property name="hibernate.dialect" value="패키지명.CustomH2Dialect"/>

 

4. JPQL에서 사용

String Query = "Select fuction('CustomFunc', m.username) From Member m"
em.createQuery(query, String.class)

혹은 축약해서, 아래처럼 사용할 수 있다. (문법 오류로 감지해 빨간줄이 생길 수 있으나, 무시하면 된다.)

String Query = "Select CustomFunc(m.username) From Member m"
em.createQuery(query, String.class)