我正在使用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工作台中的表显示事务存在,并且日期字段具有正确的类型并包含正确的值。然而,我的查询不会给我任何结果。
我有什么遗失的吗?
答案 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();