본문 바로가기

Spring/JPA

6) QueryDsl DB Function 사용하기

반응형

Query Dsl로 작성하다가 보면 DB에서 사용하던 DB Function을 사용해야 할때가 있다. 

예를 들어 아래와 같이  order by 해야 하는데  "2021-01-01 10:10:10" 인 컬럼값을 

"2021-01-01 10" 와 같이 "%Y-%m-%d %H:%i:%s" 인 형태에서 "%Y-%m-%d %H" 

로만 변형으로 해서 날짜와 시간으로 정렬을 하고자 할때는 QueryDsl 기본 문법으로 적용이 안된다. 

 

이럴때 아래와 같이 사용하면 해결이 된다.

 

public List<Contents> findContentsFunctionTest(){

        QContents contents = QContents.contents;

        List<Contents> contentsList = queryFactory.selectFrom(contents)
                .orderBy(
                    Expressions.stringTemplate("DATE_FORMAT({0}, {1})",contents.startDisplayTime, "%Y-%m-%d %H:%i").desc()
                )
                .fetch();
        return contentsList;
    }

위 소스를 보면 OrderBy 부분에 Expressions 이 사용된것이 보인다. 짐작하다시피 Expressions templates를 이용해서 DB Function을 사용할수 있고 꼭 Order By가 아닌 where 이나 다른곳에서도 사용이 가능하다.

select
        contents0_.content_id as content_1_1_,
        contents0_.display_position_code as display_2_1_,
        contents0_.start_display_time as start_di3_1_ 
    from
        contents contents0_ 
    order by
        date_format(contents0_.start_display_time, ?) desc

위와 같이 date_format fuction이 정상적으로 사용되는게 확인된다.