2016-04-30 198 views
2

我使用hibernate 5与hibernate-java8插件来使用LocalDateTime字段。我现在已经具有日期字段的实体和用户现场像:休眠:使用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工作台中的表格显示事务处在那里,并且日期字段具有正确的类型并且包含正确的值。然而,我的查询不会给我任何结果。

有什么我失踪?

+2

什么是从和值?如果这个从大到小的逻辑解释。或者你的日期不在他们之间。 –

回答

2

你逝去的PARAM日期也应当是

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();