JPA

QueryDsl where 조건에서 stringtemplate 사용하자

천천히올라가자 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에서 연산을 덜 하고 간결하게 하자는 것이지만 실제로 그럴 수 없는 환경에 놓이는 것이 현실이다 최대한 지양하는 것이 좋겠지만 어쩔 수 없다면 위와 같은 방법을 통해 해결하도록 하자

반응형