Hibernate:使用LocalDateTime查询范围

时间:2016-04-30 16:59:34

标签: java hibernate jpa hql

我正在使用hibernate 5和hibernate-java8插件来使用LocalDateTime字段。我现在有一个实体,它有一个日期字段和一个用户字段,如:

@Entity
public class Transaction {
    // ...
    private User user;
    private LocalDateTime date;
    // ..
}

现在我只想查询特定时间范围内用户的所有交易。所以我使用以下查询:

SELECT t FROM Transaction t WHERE t.user = :owner AND t.date BETWEEN :from AND :to

奇怪的是,这个查询没有给我任何结果。我也尝试使用<>运算符,但这也没有帮助。当我省略时间范围部分时,我得到了用户的正确交易清单。当我在MySQL工作台中执行Hibernate生成的SQL查询时,我也得到了预期的结果。我使用以下代码段来执行(命名)查询:

public <T> List<T> findList(Class<T> type, String queryName,
        Map<String, Object> params) {
    final EntityManager em = this.entityManager.get();
    final TypedQuery<T> query = em.createNamedQuery(queryName, type);
    params.forEach(query::setParameter);
    return query.getResultList();
}

这简单地称为提供上面列出的查询和命名参数的映射,如:

findList(Transaction.class, Transaction.BY_USER_AND_RANGE,
            ImmutableMap.of("owner", owner, "from", from, "to", to));

在我的测试用例中,使用当前日期保留了单个事务,并为查询创建了从昨天到明天的范围。检查MySQL工作台中的表显示事务存在,并且日期字段具有正确的类型并包含正确的值。然而,我的查询不会给我任何结果。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:2)

您作为参数传递的日期也应该是

  

LocalDateTime   请参阅下面的示例代码可能会帮助您

LocalDate date = LocalDate.of(2015, 8, 11);
TypedQuery<MyEntity> query = this.em.createQuery("SELECT e FROM MyEntity e WHERE date BETWEEN :start AND :end", MyEntity.class);
query.setParameter("start", date.minusDays(2));
query.setParameter("end", date.plusDays(7));
MyEntity e = query.getSingleResult();