【问题标题】:Hibernate: using LocalDateTime to query a rangeHibernate:使用 LocalDateTime 查询范围
【发布时间】:2025-12-13 22:45:01
【问题描述】:

我正在使用带有 hibernate-java8 插件的 hibernate 5 来使用 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 查询时,我也得到了预期的结果。我使用以下 sn-p 来执行(命名)查询:

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

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

我有什么遗漏的吗?

【问题讨论】:

  • from 和 to 的值是什么?如果 from 大于 to 的逻辑解释。或者你的日期不在他们之间。

标签: java hibernate jpa hql


【解决方案1】:

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

本地日期时间 请参阅下面的示例代码可能会对您有所帮助

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

【讨论】: