首页 > 解决方案 > HIbernate 5、Oracle 和本机查询 - 从 H4 升级时的破坏行为?

问题描述

我们正在对我们的主应用程序进行休眠升级(从 4.3 到最新的 5.5),我们发现了一个我们无法弄清楚的重大变化。

我们有一个相当强大的查询,该查询是在当天写回的,它对我们来说非常重要(包含一些关于我们交易的计算,如下所示:

SUM(DECODE(SIGN(at.bal_value_date - :valueDate), -1, at.amount, 0)) AS Day_M1

我们传递的是valueDateas: 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。

标签: oraclehibernate

解决方案



推荐阅读