아래와 같은 클래스가 있다.

@Entity
@Builder
@Getter
@NoArgsConstructor @AllArgsConstructor
public class PremiumPrice {
    @Id
    private Long id;

    @Column
    private BigDecimal usdPrice;

    @Column
    @CreationTimestamp
    private LocalDateTime registDate;
}

만약, 데이터를 찾을 때 registDate 를 기준으로 오늘 이후의 데이터를 찾고 싶으면 어떻게 할까?

여러 가지 방법이 있겠지만 이 글에서는 두 가지 방법을 소개한다.

 

Expressions.dateTemplate

Expressions.dateTemplate(LocalDateTime.class, "sysdate");

현재 날짜와 시간을 가져오는 것은 DBMS 마다 다른데, SYSDATE 는 Oracle 에서 사용되는 키워드로서 현재 날짜와 시간을 가져온다. 

QueryDsl 에서는 Expressions.dateTemplate 로 이러한 키워드를 가져와서 사용할 수 있도록 따로 메서드를 제공해주고 있다.

@Override
public List<Info> getList(Request param) {
    JPAQuery<Info> query = queryFactory
            .selectFrom(premiumPrice)
            .where(premiumPrice.registDate.gt(getSysDate()));

    return query.fetch();
}

private DateTemplate<LocalDateTime> getSysDate() {
    return Expressions.dateTemplate(LocalDateTime.class, "sysdate");
}

 

LocalDateTime.now()

어플리케이션단에서 아예 값을 넣어 비교하는 방식이다.

@Override
public List<Info> getList(Request param) {
    JPAQuery<Info> query = queryFactory
            .selectFrom(premiumPrice)
            .where(premiumPrice.registDate.gt(getSysDate()));

    return query.fetch();
}

private LocalDateTime getSysDate() {
    return LocalDateTime.now();
}

둘의 차이점은 시간을 DBMS 에서 계산한 값을 사용하느냐, 어플리케이션에서 제공한 값을 사용하느냐이므로 상황에 맞게 사용하면 될 것 같다.