我们有一个使用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一样成功执行查询呢?
答案 0 :(得分:1)
生成的SQL看起来很奇怪,肯定是错误的SQL。 transactio0_
是一个表别名,不应该添加到任何函数名称前。
也许选择的Hibernate方言不是HSQLDB方言。
在任何情况下,这都是旧版本的Hibernate,需要与更接近发布时间的HSQLDB版本一起使用。
关于配置HSQLDB以接受格式错误的名称,因为它太松散并且接受了错误的SQL,所以不应该修复原始行为。
答案 1 :(得分:1)
我有一个类似的问题。要解决此问题,您需要将“()”与函数名称放在一起。例如:
and NVL (transactio0_.disable_date, NOW() + 1 DAY) > NOW()
更改为
and NVL(transactio0_.disable_date, NOW() + 1 DAY) > NOW()
换句话说,删除空格字符。