ABOUT ME

-

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

    반응형

    댓글

Designed by Tistory.