【问题标题】:JPA2 Criteria and Java 8 Date&Time APIJPA2 标准和 Java 8 日期和时间 API
【发布时间】:2016-05-08 04:22:54
【问题描述】:

我尝试将 Java Web 应用程序移植到新的 Java 8 Date&Time API(使用“LocalDate”和“LocalDateTime”类型等)

在 Java 7 中,java.util.Date 可以在 JPA2 标准 API 中用于过滤日期的结果集。通常可以通过添加谓词来做到这一点,例如

..
predicatesList.add(builder.between(from.get(AccountLog_.valueDate), fromDate, toDate));
..

现在 JPA2 还不支持新的 Java 8 Date&Time API(LocalDate 和 LocalDateTime)。使用自己的“属性转换器”,已经可以按照博客 http://www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/ 中的描述与实体一起使用

现在我的问题是:如何在 JPA2 标准 API 中使用 LocalDate 和 LocalDateTime 来过滤 LocalDate 而不是 Date 的结果集?之前使用的 'between' 不适用于 LocalDate 实例。

【问题讨论】:

标签: datetime java-8 jpa-2.1


【解决方案1】:

使用我的LocalDateTimeConverter,我只是尝试greaterThanOrEqualTolessThan 来检查LocalDateTime 之类的范围

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Meal> query = cb.createQuery(Meal.class);
Root<Meal> m = query.from(Meal.class);
query.select(m);
query.where(
    cb.greaterThanOrEqualTo(m.<LocalDateTime> get(Meal.FIELD_WHEN), cb.literal(begin)),
    cb.lessThan(m.<LocalDateTime> get(Meal.FIELD_WHEN), cb.literal(end))
    );

return em.createQuery(query).getResultList();

甚至

cb.between(m.<LocalDateTime> get(Meal.FIELD_WHEN), cb.literal(begin), cb.literal(end))

按预期工作。究竟是什么导致您的代码出现问题?也许&lt;LocalDateTime&gt; 不见了?

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 2015-11-23
    • 2014-07-06
    • 2014-11-08
    • 1970-01-01
    • 2015-06-27
    • 2014-05-18
    相关资源
    最近更新 更多