JPA2 Criteria和Java 8 Date& Time API

时间:2016-01-30 11:44:29

标签: datetime java-8 jpa-2.1

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

在Java 7中,可以在JPA2条件API中使用java.util.Date来过滤日期上的结果集。通常,人们可以通过添加谓词来实现这一点,例如

..
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的结果集?之前使用的“之间”不适用于LocalDate实例。

1 个答案:

答案 0 :(得分:4)

使用我的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))

按预期工作。究竟是什么导致您的代码出现问题?可能<LocalDateTime>遗失了吗?