为什么Hibernate为Hsql函数添加模式名称?

时间:2016-06-01 22:54:43

标签: java hibernate hsqldb

我们有一个使用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一样成功执行查询呢?

2 个答案:

答案 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()

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