JPQL에서 제공하는 기본함수
- COUNT
- 결과 집합의 개수를 반환.
- 예) "SELECT COUNT(e) FROM Employee e"
- SUM
- 숫자 필드의 합계 계산.
- 예) "SELECT SUM(e.salary) FROM Employee e"
- AVG
- 숫자 필드의 평균 값을 계산.
- 예) "SELECT AVG(e.salary) FROM Employee e"
- MAX
- 숫자나 날짜 필드의 최댓값을 반환.
- 예) "SELECT MAX(e.salary) FROM Employee e"
- MIN
- 숫자나 날짜 필드의 최솟값을 반환.
- 예) "SELECT MIN(e.salary) FROM Employee e"
- DISTINCT
- 중복된 결과를 제거.
- 예) "SELECT DISTINCT e.department FROM Employee e"
- UPPER
- 문자열을 대문자로 변환.
- 예) "SELECT UPPER(e.name) FROM Employee e"
- LOWER
- 문자열을 소문자로 변환.
- 예) "SELECT LOWER(e.name) FROM Employee e"
- CONCAT
- 문자열을 연결
- 예) "SELECT CONCAT(e.firstName, ' ', e.lastName) FROM Employee e"
- TRIM
- 문자열의 양쪽 끝에 있는 공백을 제거
- 예) "SELECT TRIM(e.name) FROM Employee e"
- SUBSTRING
- 문자열의 일부분을 추출
- 예) "SELECT SUBSTRING(e.name, 1, 3) FROM Employee e"
- LENGTH
- 문자열의 길이를 반환
- 예) "SELECT LENGTH(e.name) FROM Employee e"
- CURRENT_DATE
- 현재 날짜를 반환
- 예) "SELECT e FROM Employee e WHERE e.startDate >= CURRENT_DATE"
- CURRENT_TIME
- 현재 시간을 반환
- 예) "SELECT e FROM Employee e WHERE e.startTime <= CURRENT_TIME"
- 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)
'JPA' 카테고리의 다른 글
[JPQL] 페치 조인 - Fetch Join! (JPA의 N+1 문제 해결법) (0) | 2024.03.10 |
---|---|
JPA 매핑 애너테이션들! (0) | 2024.03.07 |
[JPA+Spring] 개발 할 때, 신경써야할 체크리스트 (0) | 2023.06.20 |
[JPA] Named Query - 쿼리를 함수처럼 만들어보자 (0) | 2023.06.01 |
[JPA] 경로 표현 (0) | 2023.05.29 |