Tools & Libraries/Querydsl

[Querydsl] Querydsl 중급문법 4 (SQL function 호출하는 방법)

대기업 가고 싶은 공돌이 2024. 9. 13. 04:04

SQL function 호출하기

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

 

@Test
public void sqlFunction(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    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);
    }
}

 

위와 같이 stringtemplate으로 함수를 불러와 사용할 수 있다.

 

다만 전에 위에 말했던 것처럼 dialect에 등록된 function만 가져올 수 있다.

 

만일 자신이 만든 function을 등록해서 사용하고 싶으면

 

해당 데이터베이스의 dialect를 상속받고, ex) h2.dialect

 

클래스를 구현한 뒤 yml에 등록해서 사용해야 한다.

 

https://2junbeom.tistory.com/46

 

[JPA] 객체 지향 쿼리 언어 JPQL 4(기본 문법 - 조인, 서브쿼리, 조건식 , 기본 함수)

조인내부 조인:select m from Member m [inner] join m.team t외부 조인:select m from Member m left [outer] join m.team t세타 조인:select count(m) from Member m, Team t where m.username = t.name[]는 생략이 가능하다. 조인 - ON 절조인

2junbeom.tistory.com

자세한 방식은 위 포스트에 정리해 두었다.

 

이번엔 모든 문자를 소문자로 바꾸는 lower 함수를 써보자

 

@Test
public void sqlFunction2(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    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);
    }
}

 

예제는 쓰레기기 때문에 예제는 보지말고 그냥 함수 기능만 살펴보자

 

하지만 저런 기본적인 ANSI 표준에 등록되어 있는 함수들은 

 

Querydsl에 다 함수로 등록이 되어 있어서 잘만 찾아보면 쓸 수 있는 함수가 굉장히 많다.

 

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

 

lower도 위와 같이 querydsl에 등록된 함수로 간단하게 표현할 수 있다.