서론
---
회사에서 일 별 합계를 구해야 하는 페이지를 제작 중에 시간까지 저장되어 있는 쿼리를 어떻게
변환하여 적용하는 지에 대해 꽤 오랜 시간을 찾다가 깨닫게 되어서 글을 작성해본다.
본론
--
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은 쿼리랑 연결하는 것 이기 때문에..!
'JVM > JPA' 카테고리의 다른 글
[QueryDSL] return 으로 Map(집합) 받기 (2) | 2022.01.25 |
---|---|
[JPA] save() isNew를 사용하여 성능개선 하기 (0) | 2021.10.02 |
[QueryDSL]like, contains 차이 (0) | 2021.05.01 |
[QueryDSL] 표현식 정리 (0) | 2021.04.18 |
[JPA] PostgreSQL @Lob 에러 (0) | 2021.04.17 |