oracle - HIbernate 5、Oracle 和本机查询 - 从 H4 升级时的破坏行为?
问题描述
我们正在对我们的主应用程序进行休眠升级(从 4.3 到最新的 5.5),我们发现了一个我们无法弄清楚的重大变化。
我们有一个相当强大的查询,该查询是在当天写回的,它对我们来说非常重要(包含一些关于我们交易的计算,如下所示:
SUM(DECODE(SIGN(at.bal_value_date - :valueDate), -1, at.amount, 0)) AS Day_M1
我们传递的是valueDate
as: query.setParameter("valueDate", valueDate, TemporalType.DATE);
(valueDate
变量是一个普通的java.util.Date
)。该列是一个java DATE
(可以包含具有秒精度的日期和时间,没有毫秒或时区)。
升级到 Hibernate 5 时,我们开始收到此错误:SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND
. 激活调试日志,我们发现 Hibernate 4 将值绑定为 DATE,而 v5 映射为 TIMESTAMP。这种变化似乎是使 Oracle 以不同方式计算结果从而出错的原因。
我们确实设法通过将参数更改为字符串并将查询更改为:
SUM(DECODE(SIGN(at.bal_value_date - TO_DATE(:valueDate, 'YYYY-MM-DD HH24:MI:SS')), -1, at.amount, 0)) AS Day_M1
(我们不能使用 java LocalDate
,因为它没有我们需要的时间组件)。
知道为什么会发生这种行为变化吗?可能的错误或预期行为?
环境 Java 是 8.xxx(不记得了),spring 5.2.4,Oracle 是 19c。
解决方案
推荐阅读
- vert.x - Vertx program memory keeps growing
- sql - Write a query in which rate was not change in between these dates
- java - Elasticsearch aggregation when a field does not exist takes a long time
- python - How to convert JPG images to AVIF with Python
- r - 使用 fct_collapse 标记值并仅对数据框列表中的组运行回归
- java - 如何使用 oracle DB 在 jdbc 中按 DATE 类型进行选择?
- mysql - 如何将 MySQL 表格行转换为 Excel 多张工作表(表格中的每一行都是 Excel 工作表)
- flutter - 如何在不属于该栏的页面上显示导航栏?
- python - 如何将 bash 脚本代码更改为 Python
- kubernetes - Kubernetes编程:CRD、控制器和算子学习资料