Java / / 2022. 8. 30. 17:24

[QueryDSL] DATE_FORMAT 사용하기

반응형

서론

QueryDSL에서도 SQL Function 사용을 통해 쿼리를 간단하게 작성해야 할 경우가 있다.

이 경우, Expressions.StringTemplate(), Expressions.numberTemplate() 등을 통해 SQL Function을 사용할 수 있다.

이를 통해 Date cast, Lower case 작성 등을 QueryDSL에서 쉽게 사용이 가능하다.

 

MySQL에서 DATE 건드리기

먼저 MySQL에서 Date_Format을 사용하는 방법을 알아보자.

//Date 포맷을 변경하고 날짜를 지정한 형식으로 출력
DATE_FORMAT('2022-03-24', '%Y%m%d')
DATE_FORMAT(날짜, 변경할 양식)

//Date 날짜를 더하거나 빼야할 경우
DATE_ADD(기준날짜, INTERVAL)
DATE_SUB(기준날짜, INTERVAL)
예를들면, DATE_ADD(NOW(), INTERVAL 1 DAY) 여기에 DAY 말고 SECOND 등 가능.

 

 

 

 

※ 참고 : Date_Format - 구분 기호

https://devjhs.tistory.com/89

 


 

 

▶ QueryDSL에서 DATE 건드리기

Date 객체를 건드리는 이유는 위의 MySQL에서 한 것처럼, 포맷이나 날짜를 변경하기 위해서이다.

하지만 QueryDSL에서 제공하는 기능만으로는 조금 힘들다.

이럴 때 위에서 보았던, Expressions.StringTemplate(), Expressions.numberTemplate() 등으로 템플릿을 열어서 사용한다. 그래서 MySQL 문법을 사용하는 점은 동일하다.

 

Expressions.StringTemplate(MySql 문법, {0} 변경할 값, '{1s}'변경할 양식 )

//데이터 포맷 변경
StringTemplate dateFormat = Expressions.stringTemplate( 
		"DATE_FORMAT( {0}, '{1s}' )", '2022-03-24', ConstantImpl.create("%Y%m%d")
        );
        
//여기서 '{1s}' 처럼 작은따옴표와 s를 넣어주어야 쿼리에 정상적으로 '%Y'와 같이 주입된다
  • 이렇게 Expressions를 활용해서 MySQL 구문을 만들어두고 queryDSL코드에 삽입해서 사용한다.
  • DateTamplate을 써도 되고, 마찬가지로 Expressions가 메서드로 가지고 있다.)

 

Expressions.dateTemplate(표현 유형, MySql 문법, {0} 변경할 값, '{1s}'변경할 양식 )

//데이터 포맷 변경
StringTemplate dateFormat = Expressions.dateTemplate( 
		String.class, "DATE_FORMAT({0}, '{1s}')", '2022-03-24', ConstantImpl.create("%Y%m%d")
        );
  • 첫 번째 인자는 표현식 유형으로 responseDto에서 regDate 타입을 String으로 했다면 String.class로 한다.
  • 나머지는 stringTemplate과 같다.

 

 

 

추가 예시

//추가 예시
public List<StatisticsDto> countOfMonth(String an_year, String an_month) {

        StringTemplate an_YearDateFormat = getDateFormat("%Y");
        StringTemplate an_MonthDateFormat = getDateFormat("%m");
        StringTemplate an_DayDateFormat = getDateFormat("%d");

	//queryDSL에 사용
        return  qf.select(
                        new QStatisticsDto(an_YearDateFormat.as("an_year"), an_MonthDateFormat.as("an_month"), an_DayDateFormat.as("an_day"), test.count().as("count"))
                )
                .from(test)
                .where(an_YearDateFormat.eq(an_year), an_MonthDateFormat.eq(an_month))
                .groupBy(an_DayDateFormat)
                .fetch();
    }

    private StringTemplate getDateFormat(String obj) {
        return Expressions.stringTemplate("DATE_FORMAT({0}, '{1s}')", test.reg_date, ConstantImpl.create(obj));
    }

 

참고 : Loweer Case

StringTemplate test = Expressions.stringTemplate("lower({0})", myTable.name).in(nameList);
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유