为啥 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我使用 Spring-Data 时 Maven 会添加 Hibernate Jars
Spring with Hibernate-如何动态传递模式名称