Spring JPA:使用 CriteriaBuilder 过滤两个时刻之间的日期时间

Spring JPA: Use CriteriaBuilder to filter on a datetime between two instants

我正在设置一种方法来按“lastupdated”列过滤条目。我正在尝试过滤上次更新值介于给定 startTime 和 endTime 之间的条目。 我正在使用下面的简化代码:

public List<SomeEntity> getItemsByLastUpdated() {

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<SomeEntity> criteriaQuery = cb.createQuery(SomeEntity.class);

    var root = criteriaQuery.from(SomeEntity.class);
    var predicates = new ArrayList<>();

    var startTime = Instant.now();
    var endTime = Instant.now().plus(5, MINUTES);

    predicates.add(cb.greaterThanOrEqualTo(root.get("lastupdated"), startTime));
    predicates.add(cb.lessThan(root.get("lastupdated"), endTime));

    criteriaQuery.where(predicates.toArray(new Predicate[0]));
    return entityManager.createQuery(criteriaQuery).getResultList();
}

出于某种原因,日期时间字段的条件未(正确)应用:所有实体都被返回,而不是仅返回 startTime-endTime 范围内的项目。

我猜我需要明确声明“lastupdated”字段是一个日期时间字段;当我将 startTime 设置为 Instant.MAX 时,我收到一个错误,似乎暗示日期过滤器而不是日期时间:

Invalid value for EpochDay (valid values -365243219162 - 365241780471): 365241780838

有人知道我如何过滤两个给定 java 时刻之间的日期时间字段吗?

PS。我知道使用 findByXGreaterThanOrEqualToAndXLessThan(Instant instant1, Instant instant2); 等派生查询,但由于还有其他几个我没有包括的条件,这个选项不可行。

我认为您可以使用 EntityManager 和 JPQL 而不是 Criteria API:

轻松地做同样的事情
public List<SomeEntity> getItemsByLastUpdated() {
    var query = "select e from SomeEntity e
                  where e.lastupdated >= :from
                    and e.lastupdated <  :to
                    and your_other_criteria";

    return entityManager.createQuery(query)
                .setParameter("from", startTime)
                .setParameter("to", endTime)
                .getResultList();
}

我花了很长时间才弄明白;事实证明,缺少过滤与 CriteriaBuilder 设置没有任何关系。

我创建了一个测试来验证该方法,并在 运行 测试之前准备了一些实体。然而,实体 class 中的“lastupdated”字段被注释为 @UpdateTimestamp,这将导致所有保存的实体具有几乎相同的 'lastupdated' 值。