[Hibernate] DBMS custom function 을 ORM에서 호출하는 방법공부/Spring2022. 4. 7. 21:48
Table of Contents
반응형
개요
- ORM 으로 Hibernate를 맨땅에서 시작한지 3개월 차, 요구사항 기능 구현하는데 custom function이 필요하게 되었다.
- 상세한 내용은 생략하고 설정 방법과 Criteriabuilder로 어떻게 function을 사용해서 호출했는지에 대해서만 기록함
1. Mysql function 생성
- Mysql v8.0에는 regexp_replace가 있지만, Mysql5.7에는 없어서 인터넷에 굴러다니는 create function문 수정해서 사용
- regexp_replace_cast() 로 특수문자/영문 지우고 BIGINT형 값 리턴하도록 함.(아래 링크 참조)
2. Hibernate 설정
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;
public class MySQLDialect extends org.hibernate.dialect.MySQL5Dialect {
public MySQLDialect() {
super();
// 함수 등록
registerFunction("regexp_replace_cast",
new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "regexp_replace_cast(?1, ?2, ?3)"));
}
}
3. Criteriabuilder 에서 사용하기
private static final Pattern EXCEPT_CHAR = Pattern.compile("[.`~!@#$%^&*();:/?a-zA-Z_-]");
private static final String EXCEPT_CHAR_REPLACEMENT = "";
...
/*
직접 작성한 CriteriaBuilder 조건식 부분만 기재
아래와 같은 형태로 조건문 추가됨 (regexp_replace_cast는 직접 생성한 함수)
SELECT 컬럼..
FROM 테이블명
WHERE 조건..
AND (
regexp_replace_cast(file_name, '[.`~!@#$%^&*();:/?a-zA-Z_-]', '') between startFileNumber and endFileNumber
)
*/
if(!Objects.isNull(additional.getStartFileNumber()) && !Objects.isNull(additional.getEndFileNumber())) {
predicates.add(builder.between(
builder.function("regexp_replace_cast", // 호출 함수명
Integer.class, // 결과 타입
root.get("fileName"), // ?1에 해당하는 argument
builder.literal(EXCEPT_CHAR.toString()), // ?2에 해당
builder.literal(EXCEPT_CHAR_REPLACEMENT) // ?3에 해당
), additional.getStartFileNumber(), additional.getEndFileNumber())); // Between A And B
}
CriteriaBuilder 공식 Reference
*.function 만
function
<T> Expression<T> function(java.lang.String name,
java.lang.Class<T> type,
Expression<?>... args)
Create an expression for the execution of a database function.
Parameters:
name - function name
type - expected result type --- 역시🤔😎
args - function arguments
Returns:
expression
참고
https://localcoder.org/use-regular-expressions-in-jpa-criteriabuilder
https://www.tabnine.com/code/java/methods/org.hibernate.dialect.Dialect/registerFunction
https://linuxtut.com/en/bb05c75c918ba004575a/
https://blog.leocat.kr/notes/2020/08/16/hibernate-use-databse-function
이렇게 하나씩 알아간다. 👨💻 영어로 검색이나, reference 읽는 습관 가지면서 개발이 재미있어 진다.
반응형
'공부 > Spring' 카테고리의 다른 글
@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!