首页 > 解决方案 > Hibernate 将时间 Date 作为 Timestamp 与本机查询绑定

问题描述

我正在将应用程序中的 Hibernate 从 3.x 升级到最新版本(截至目前为 5.4.14)并自己完成所有更改。相对于本机查询,使用TemporalType.DATE的方式似乎发生了变化。对我来说,这种变化感觉像是一个错误,但可能有一个合理的解释。作为一个非常简单的用例,请考虑以下查询:

    final Query query1 = entityManager.createNativeQuery("select :date");
    query1.setParameter("date", new Date(), TemporalType.DATE);
    query1.getSingleResult();

这是此应用程序中的常见设置,预期行为是将给定的日期视为数据库中的日期。通常用于针对日期列的范围查询。但是,由于查询中使用了Date的时间戳部分,这在边缘中不再起作用。当我启用 Hibernate 跟踪时,我看到以下内容:

[BasicBinder#bind(64)] 绑定参数 [1] 作为 [TIMESTAMP] - [Mon Apr 27 11:15:30 CEST 2020]

作为比较,我做了以下查询:

    final Query query2 = entityManager.createNativeQuery("select :date");
    query2.setParameter("date", LocalDate.now());
    query2.getSingleResult();

带有以下跟踪:

[BasicBinder#bind(64)] 绑定参数 [1] 作为 [DATE] - [2020-04-27]

显然,这两种方法的处理方式不同。对我来说,它们应该是等价的。当我进入 Hibernate 代码以调用TemporalType.DATE的setParameter时,我看到 Hibernate 只是忽略了我的TemporalType.DATE

这是针对本机查询的,当使用setParameterTemporalType.DATE时,它似乎确实可以按我对非本机查询的预期工作。

这是预期的行为吗?

标签: hibernatedate

解决方案


推荐阅读