【问题标题】:Spring Data JPA Timestamp comparisonSpring Data JPA 时间戳比较
【发布时间】:2019-03-17 09:37:29
【问题描述】:

我正在尝试将本机查询转换为规范。我被困在这种情况下:

....
WHERE
TIMESTAMP(D_DATA, D_TIME) >= '2015-06-23 05:46:53.000000'

有没有办法获得与规范相同的结果?

谢谢

【问题讨论】:

  • 您的 SQL 数据库是什么(例如 MySQL、SQL Server、Oracle)?
  • 我的数据库是 DB2
  • 还告诉我们D_DATAD_TIME 的类型。我的总体感觉是您的表应该只存储单个时间戳,而不是分隔日期和时间。
  • 类型是日期和时间,我不能修改表格。我需要从代码中解决问题。
  • 问题是,JPA 对日期/时间的支持并不多。您正在使用的TIMESTAMP 函数几乎是特定于DB2 的。因此,在这种情况下,如果您确实无法更改表,您可能必须继续使用本机查询。

标签: java sql spring-data-jpa db2


【解决方案1】:

感谢 Paul Vernon,我解决了:

public static Specification<Transit>compareTimestamps(Timestamp timestamp){
    LocalTime localTime = timestamp.toLocalDateTime().toLocalTime();
    LocalDate localDate = timestamp.toLocalDateTime().toLocalDate();
    Specification<Transit> dateSpec = compareDateWithTimestamp(localDate);
    Specification<Transit> dateTimeSpec = compareDateAndTimeWithTimestamp(localDate, localTime);
    return where(dateSpec).or(dateTimeSpec);
}

private static <T>Specification<T> compareDateWithTimestamp(LocalDate localDate){
    return (Specification<T>) (root,query,cb) -> cb.greaterThan(root.get("dTrn"),localDate);
}
private static <T>Specification<T> compareDateAndTimeWithTimestamp(LocalDate localDate, LocalTime localTime){
    return (Specification<T>) (root, query, cb) -> {
        List<Predicate> predicates = new ArrayList<>();
        predicates.add(cb.equal(root.get("dTrn"),localDate));
        predicates.add(cb.greaterThanOrEqualTo(root.get("dTimTrn"),localTime));
        return cb.and(predicates.toArray(new Predicate[]{}));
    };
}

【讨论】:

    【解决方案2】:

    不确定它是否有帮助,但该过滤器也可以在 Db2 中这样编写。

    WHERE
         D_DATA >= '2015-06-23'
    OR ( D_DATA  = '2015-06-23' AND D_TIME >= '05:46:53' )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2017-10-05
      • 2012-07-09
      • 1970-01-01
      • 2011-02-02
      • 2016-07-26
      • 2011-07-24
      相关资源
      最近更新 更多