티스토리 뷰
[QueryDSL] LocalDateTime 형식 DateTimeExpression 으로 년월(YYYYMM)만 비교하기
종벌🍀 2024. 3. 7. 11:35
엔티티의 LocalDateTime 날짜형식 데이터를 년월(YYYY-MM) 로만 비교해줘야 하는 상황이 생겼다.
그 동안은 String 형식으로 넘어온 날짜데이터를 비교할 때,
AttributeConverter 를 사용해서 mapstruct 에서나 querydsl 에서 사용해왔었다.
[Mapstruct] LocalDateTime To String Converter, 엔티티와 DTO간 타입이 다를때 맵핑하기 (feat.AttributeConverter)
보통 날짜값을 사용할 때 db와 뷰와의 관계에서 컨버팅을 자주 하게 된다. DB에는 예쁘게 들어가있지만 사용자 화면에 그대로 뿌리면 보통 우리가 보던 포맷이 아니기 때문에 매우 별로다. 그래
jong-bae.tistory.com
그 동안 비교값을 LocalDateTime 으로 파싱해서 비교해 쿼리를 작성했는데
역으로 하려니 뜻대로 잘 되지 않았다.
이런 경우 찾아보니
Expressions 의 stringTemplate 이나 dateTemplate를 사용하여 DB 함수를 이용하여 포맷을 변경하여 비교해주더라
이 방식으로 해도 되긴하지만 문제가 DB 가 변경되었을때 컨버팅 함수를 직접 수정해줘야 했다.
JPA의 이점이 없어지는 순간...
(바꿀일은 거의 없겠지만 만약 먼 훗날에 바꾼다면 에러를 맞이하겠지...)
그러던 중 qClass 를 열어봤는데
LocalDateTime 데이터형을 DateTimePath<> 형으로 받고 있는것을 뒤늦게 발견했다.
public final DateTimePath<java.time.LocalDateTime> regDate = createDateTime("regDate", java.time.LocalDateTime.class);
public class DateTimePath<T extends Comparable> extends DateTimeExpression<T> implements Path<T> {
...
}
DateTimeExpression 안에 yearMonth() 메소드가 있는 것을 발견!
public NumberExpression<Integer> yearMonth() {
if (this.yearMonth == null) {
this.yearMonth = Expressions.numberOperation(Integer.class, DateTimeOps.YEAR_MONTH, new Expression[]{this.mixin});
}
return this.yearMonth;
}
내가 원하는데로 년월 비교가 가능할 것인가!!!
sampleEntity.regDate.yearMonth().eq(Integer.valueOf(searchParam.getSearchYearMonth()))
select
...
from
... keywordent0_
where
extract(year
from
keywordent0_.REG_DATE)*100+extract(month
from
keywordent0_.REG_DATE)=202401
결과는 오라클의 날짜변환 함수를 사용하여 YYYYMM 형식의 숫자로 비교를 해주는 것을 확인했다.
(MSSQL이나 mysql 에서도 각각의 DB함수를 사용하여 쿼리를 만들어내는지는 테스트를 좀 더 해보긴 해야겠다.)
SELECT
EXTRACT(YEAR FROM KEYWORD.REG_DATE)*100 + EXTRACT(MONTH FROM KEYWORD.REG_DATE) AS yyyymm,
FROM KEYWORD
년도에 100을 곱한 후 월을 더해주는 방식으로 숫자를 만들어 비교한다.
(년도*100) + 월 = 202403
검색필터 쿼리여서 간단하게 처리는 했으나
이것이 대용량 조회할 때 이점이 있을지는 모르겠다.
'Java > JPA, QueryDSL' 카테고리의 다른 글
[QueryDSL] PathBuilder 를 활용한 동적쿼리 (0) | 2024.11.26 |
---|---|
[JPA] Soft Delete 사용. (feat.@SQLDelete) (0) | 2024.11.01 |
[JPA] DB환경별 다중 schema, catalog 엔티티 적용법 (2) | 2023.11.22 |
[QueryDSL] Projections, @QueryProjection 을 사용하여 DTO로 반환하기 (1) | 2023.11.13 |
[QueryDSL] 다중 Datasource 설정하기 (feat.@Qualifier 사용) (0) | 2023.11.13 |