hibernate - 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。
这是针对本机查询的,当使用setParameter和TemporalType.DATE时,它似乎确实可以按我对非本机查询的预期工作。
这是预期的行为吗?
解决方案
推荐阅读
- c++ - 解决和理解 Visual Studio (C++) 中的外部符号错误
- c# - 仅当用户从第二个表单成功登录时,如何使主表单显示?
- python-3.x - 使用python编译的protobuf pb2作为键值序列化器
- javascript - 从嵌套对象javascript中删除对象
- tableau-api - 有条件地格式化单元格背景颜色时没有总计
- sql - PL/SQL 因为我在执行对象主体时遇到错误?
- time - 农民需要在 NetLogo 中的离散时间/刻度后更改值
- linux - 守护进程不能关闭使用 DBus 保存的 X11 屏幕吗?
- react-native - firestore 从 react native 中保存可拖动的图像
- faunadb - 从动物数据库获取对象时增加数字?