-
QueryDsl where 조건에서 stringtemplate 사용하자JPA 2021. 7. 14. 20:00반응형
몇 년 전에 querydsl을 사용하고 나서 해당 연산을 어떻게 해야 하는지 시행착오가 좀 있었는데
최근에 같은 팀원분이 어떻게 해야 되는지 물어봐서 다른 사람들도 모를 수 있겠구나 하고 글을 적어본다
보통 querydsl에서 비교를 할 때 우리는 다음과 같이 한다
LocalDateTime createDate = LocalDateTime.now(); 생략 .where( qOrderSheet.createDate.gt(createDate) );
qOrderSheet.createDate.gt(createDate)처럼 칼럼에다 주어진 값을 전달해서 같은지 큰지 적은 지 등등 비교를 한다
하지만 위와 같은 작업으로만 다 될 수 있는 것은 아니다 만약 아래와 같이 하고 싶다면?
.where( qOrderSheet.createDate.gt(qOrderSheet.createDate - 연산처리) );
createDate처럼 값을 주는 것이 아니라 컬럼을 주고 그 칼럼을 연산해야 된다면 어떻게 해야 할까?
StringTemplate createDate = Expressions.stringTemplate( "cast(extract(epoch from {0}) as long)", qOrderSheetDetail.createDate ); .where( qOrderSheet.createDate.gt(createDate) );
stringTemplate를 사용해서 해결 할해결할 수 있다 createDate를 stringTemplate화 해서 해결할 수 있는 것이다
그럼 아래와 같이 양쪽이 그래야 한다면? 두개를 만들어 주면 된다 아래 예제를 보자
StringTemplate viewDay = Expressions.stringTemplate( "cast(extract(epoch from current_timestamp) as long) - 24 * 60 * 60 * {0}", 1 ); StringTemplate createDate = Expressions.stringTemplate( "cast(extract(epoch from {0}) as long)", qOrderSheetDetail.createDate ); .where( createDate.eq(viewDay) );
위와 같이 작성하는게 코드의 품질이 떨어지고 최근 추세는 db에서 연산을 덜 하고 간결하게 하자는 것이지만 실제로 그럴 수 없는 환경에 놓이는 것이 현실이다 최대한 지양하는 것이 좋겠지만 어쩔 수 없다면 위와 같은 방법을 통해 해결하도록 하자
반응형'JPA' 카테고리의 다른 글
spring batch에서 JPASQLQuery를 사용한 이유 (0) 2021.04.05 Spring Batch with QuerydslItemReader (0) 2020.05.02 QueryDsl - char(1)보다는 varchar(1)을 사용하자 (0) 2019.10.21 QueryDsl from subquery와 join을 해보자! (10) 2019.09.03 QueryDsl - Date 작성시 Expressions.dateTemplate를 사용하자! (2) 2019.09.03