본문 바로가기

꿀팁 활용

[QueryDSL] Expressions.dateTemplate !! 혹은 StringTemplate ?? QueryDSL 날짜시간 컬럼 나눠쓰기(split)

서론

---

회사에서 일 별 합계를 구해야 하는 페이지를 제작 중에 시간까지 저장되어 있는 쿼리를 어떻게 

변환하여 적용하는 지에 대해 꽤 오랜 시간을 찾다가 깨닫게 되어서 글을 작성해본다.

 

본론

--

dsl에 있는 메소드인 'Expressions.stringTemplate' 를 사용하면 된다.

DateTemplate formattedDate = Expressions.dateTemplate(LocalDateTime.class, "DATE_FORMAT({0}, {1})", qItem.loadDt, "%d/%m/%Y");

DateTemplate formattedDate = Expressions.dateTemplate(LocalDateTime.class, "DATE_FORMAT({0}, {1})", qItem.loadDt, "yyyy-mm-dd");

 

 

위와 같은 예제는 구글링을 해보면 스택오버플로어나 블로그에 많이 볼 수 있었다.

하지만 나의 문제는 조금(?) 달랐다.

 

1. 쿼리 타입이 varchar 였다.

2. 쿼리를 MySql이 아닌 MsSql을 사용했다.

3. 쿼리 문법을 잘 알지 못했고, dsl을 사용한 지 일주일 밖에 되질 않았다. (이게 제일 컸다..)

 

위 3가지의 문제 때문에 나의 오후 시간을 순삭- 시켜버렸다.

맨 위와 같은 예제에서 보이는 "DATE_FORMAT"은 MySQL 문법이었기 때문에

내 프로젝트에서는 에러를 뱉어냈으며, MsSql 에 해당하는 날짜변환 하는 방법을 알아야 했다.

또한, LocalDateTime으로 인해 시간 값이 필수로 들어가기 때문에 일 별 합산이 안 되고 있었다.

그로 인해 나는 String으로 변환하여 보여주는 방식을 택했다.

 

 

해결 코드

StringTemplate formattedDate = Expressions.stringTemplate("CONVERT(CHAR(10), {0})", qContainerBoxInventory.loadDt);

dsl에는 DateTemplate 뿐만 아니라 StringTemplate 와 같이 다른 템플릿들이 존재했다.

이걸 깨닫는 데에 시간을 많이 허비하고야 말았다...

또한, MsSql에서 "DATE_FORMAT"이 안된다는 것을 깨닫고 MsSql에 맞는 변환을 찾아

CONVERT 를 알 수 있었다.

결국 위처럼 형변환에 성공하였고, Group By 또한 성공적으로 하였다.

 

.

.

.

 

 

쿼리 타입이 varchar였지만, 안에 데이터가 시간까지 포함된 DateTime 값과 똑같이 들어가 있었기에

Java DTO에 선언된 LocalDateTime 타입으로 인해 쿼리 타입은 큰 문제가 없었던 것 같다.

 

 

결국, 값을 합치는 과정인 select 에서 타입을 String으로 보여주는 부분에서 문제였던 것 같다.

선임님께서 별로 좋은 코드는 아닌 것 같다고 말씀해주셨다.

 

 

흠.. 다들 Time까지 사용하기 때문에 LocalDateTime 을 사용한건가..

난 일 별로 합치고 싶었기 때문에 LocalDateTime로 하면 시간까지 딸려나오기 때문에 계속 같은 시간까지만

그룹이 지어져서 골치가 아팠는데 말이징...

그냥 Date 타입으로는 제대로 될려나..? 글 쓰다가 갑자기 궁금해졌다.

내일 회사가서 한 번 해봐야겠다.

 

 

...

(후기)

해봤는데 쿼리 타입이 varchar이기 때문에 스트링템플릿을 사용해야 했다.

왜냐하면 dsl은 쿼리랑 연결하는 것 이기 때문에..!

 

(실습)

 

System.err.println(Expressions.stringTemplate("DATE_FORMAT({0}, {1})",Expressions.path(Guide::class.java, guide, "createdAt"), "%Y-%m-%d %H:%i"))

 

 

 

출처 : https://kdhyo98.tistory.com/20

 

 

 

MSSQLDATE날짜변환

참고사이트