스프링/QueryDsl

[QueryDsl] sqlFunction 사용하기

nomoreFt 2022. 3. 13. 23:45

보통 일반적인 내장 function들은 기본제공된다.
각 DB에 맞춘 Dialect에 선언된 Function들은 기본 제공되지만, 자기가 DB에 만든 Function은
기본 Dialect를 상속받아 만든 파일을 등록하고, yml같은 파일에 선언해줘야한다.

H2Dialect에 선언된 기본 기능들

rtrim, space 등등 다양한 기능들을 제공한다.

image

 

image

기본 사용 기능중 replace 예제

 @Test
    public void sqlFunction() throws Exception {
        //username의 memeber를 다 m으로 치환하는 Function
        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);
        }

        /* select function('replace', member1.username, 'member'1, 'm'2)
from Member member1 */
        /*
        select replace(member0_.username, NULL, ?) as col_0_0_ from member member0_;
         */
    }

기본적으로 Expressions를 사용하지만, 너무 내장 기본 기능은 이미 구현되어있으므로, 그냥 QObject의 lower()같이 사용할 수 있다.


    @Test
    public void sqlFunction2() throws Exception {
        //username의 memeber를 다 소문자로 변환시키는 Function
        List<Member> result = queryFactory
                .select(member
                ).from(member)
                //.where(member.username.eq(Expressions.stringTemplate("function('lower', {0})", member.username)))
                .where(member.username.eq(member.username.lower()))
                .fetch();

        for (Member s : result) {
            System.out.println(s);
        }

        /* select function('lower', member1.username)
from Member member1 */
        /*
        select lower(member0_.username) as col_0_0_ from member member0_;
         */
    }