为啥 Hibernate 将模式名称添加到 Hsql 函数?

Posted

技术标签:

【中文标题】为啥 Hibernate 将模式名称添加到 Hsql 函数?【英文标题】:Why is Hibernate adding schema name to Hsql functions?为什么 Hibernate 将模式名称添加到 Hsql 函数? 【发布时间】:2016-06-01 22:54:42 【问题描述】:

我们有一个使用 Hibernate 3.0.3 的旧版应用程序。我们使用 HSQLDB 进行单元测试。 Hibernate 生成的查询之一如下所示:

select
 transactio0_.REASON_ID as REASON1_0_,
 transactio0_.DESCRIPTION as DESCRIPT2_93_0_,
 transactio0_.REASON_NAME as REASON3_93_0_ 
from APPS.MTL_TRANSACTION_REASONS transactio0_ 
where transactio0_.REASON_ID=54
 and transactio0_.NVL (transactio0_.disable_date, NOW() + 1 DAY) > NOW()

请注意,模式名称“transactio0_”被添加到 NVL 函数之前。为什么?我们如何配置 Hibernate 使其不这样做?

下一个问题涉及我们正在使用的 HSQLDB 版本。我们目前正在使用 HSQLDB 2.2.8,并希望升级到 HSQLDB 2.3.2。 上述查询在 HSQLDB 2.2.8 中运行良好,但在 HSQLDB 2.3.2 中失败并出现“无效的模式名称”错误。有什么方法可以配置 HSQLDB 2.3.2 使其能够像 HSQLDB 2.2.8 一样成功执行查询?

【问题讨论】:

【参考方案1】:

生成的 SQL 看起来很奇怪,肯定是不正确的 SQL。 transactio0_ 是表别名,不应添加到任何函数名之前。

可能选择的 Hibernate 方言不是 HSQLDB 方言。

无论如何,这是一个旧版本的 Hibernate,需要与更接近其发布时间的 HSQLDB 版本一起使用。

关于将 HSQLDB 配置为接受格式错误的名称,这应该是不可能的,因为原始行为已被修复,因为它过于宽松并接受了错误的 SQL。

【讨论】:

【参考方案2】:

我遇到了类似的问题。要解决此问题,您需要将“()”与函数名称放在一起。例如:

and NVL (transactio0_.disable_date, NOW() + 1 DAY) > NOW()

改成

and NVL(transactio0_.disable_date, NOW() + 1 DAY) > NOW()

换句话说,删除空格字符。

【讨论】:

以上是关于为啥 Hibernate 将模式名称添加到 Hsql 函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Hibernate 不填充这个外键列

为啥将库添加到链接器命令行两次?

为啥当我使用 Spring-Data 时 Maven 会添加 Hibernate Jars

Spring with Hibernate-如何动态传递模式名称

为啥 Spring 在使用 Hibernate 3 时推迟关闭 Hibernate 会话

Hibernate:啥是连接池,为啥默认的连接池不适合生产?