반응형
서론
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 - 구분 기호
▶ 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);
반응형
'Java' 카테고리의 다른 글
[JPA] entity < -- > DTO 변환 시 실무에는 어떻게 처리할까? (0) | 2022.08.31 |
---|---|
[Java] 자바 Stream (map, filter, sorted, collect) (0) | 2022.08.31 |
[React] 비동기로 동작하는 setState에 대한 (0) | 2022.08.30 |
[JAP] 트랜잭션이란 무엇일까? (0) | 2022.08.19 |
[MYSQL] AES_ENCRYPT / AES_DECRYPT (0) | 2022.08.18 |