Java / / 2023. 1. 16. 11:02

[JPA] SQL function 호출하기

반응형

해당 글은 김영한 님의 querydsl을 수강하며 정리하려고 적는 포스팅입니다.

 

SQL function

  • SQL function은 JPA와 같이 Dialect에 등록된 내용만 호출할 수 있다.

 

member - M으로 변경하는 replace 함수 사용

@Test
public void sqlFunction() {
    List<String> result = queryFactory
            .select(Expressions.stringTemplate("function('replace', {0}, {1}, {2})",
                    member.username, "member", "M"))
            .from(member)
            .fetch();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}
------------------------------------------------------------------------------------
2023-01-16T10:13:26.947+09:00 DEBUG 18232 --- [           main] org.hibernate.SQL                        : 
/* select
    function('replace', member1.username, ?1, ?2) 
from
    Member member1 */ select
        replace(m1_0.username,?,?) 
    from
        member m1_0
            
s = M1
s = M2
s = M3
s = M4

 

소문자로 변경해서 비교

@Test
public void sqlFunction2() {
    List<String> result = queryFactory
            .select(member.username)
            .from(member)
            .where(member.username.eq(
                    Expressions.stringTemplate("function('lower', {0})", member.username)))
            .fetch();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}
----------------------------------------------------------------------------------------------
2023-01-16T10:14:13.500+09:00 DEBUG 17236 --- [           main] org.hibernate.SQL                        : 
/* select
    member1.username 
from
    Member member1 
where
    member1.username = function('lower', member1.username) */ select
        m1_0.username 
    from
        member m1_0 
    where
        m1_0.username=lower(m1_0.username)
            
s = member1
s = member2
s = member3
s = member4

 

직접 만든 SQL Function을 사용하고 싶다면, H2Dialect 상속을 받아서 만들고 등록을해서 사용해야한다.

 

간단한 일반화된 Function은 QueryDsl에 내장되어 있다.

lower 같은 ansi 표준 함수들은 querydsl이 상당부분 내장하고 있어서 아래와 같이 처리해도 결과는 같아진다.

.where(member.username.eq(member.username.lower()))

 

참고 : Custom Dialect

인텔리제이에서 [shift + shift] 를 눌러 전체 검색에 H2Dialect를 검색해보면 된다.

그러면 아래에 수많은 functiond들을 기본으로 사용자가 쉽게 사용 할 수 있도록 미리 구현 시켜 두었다.

 

dialect를 상속하여 사용자 function 만들기

참고

https://055055.tistory.com/83

 

JPA Dialect

김영한님의 강의 내용 정리, oracle dialect 상속 및 사용자 함수 추가 Dialect? 표준 SQL인 ANSI SQL외에, DBMS인 Oracle, MySQL, MS-SQL, PostgreSQL마다 문법과 함수가 조금씩 다른 경우가 있다. 이러한 SQL 표준을

055055.tistory.com

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유