JUnit/HSQLDB:使用HSQLDB进行测试时如何解决Oracle语法错误(没有特权和/或没有DUAL对象)

Jam*_*ams 4 oracle junit hibernate jdbc hsqldb

我有DAO代码,其中包含一些具有Oracle特定语法的JDBC,例如:

select count(*) cnt from DUAL 
where exists (select null from " + TABLE_NAME + "
              where LOCATION = '" + location + "')")
Run Code Online (Sandbox Code Playgroud)

我正在使用内存中的HSQLDB数据库对此DAO方法运行JUnit测试.显然,DUAL表是特定于Oracle的,并且在运行测试时会导致错误:

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; 
    bad SQL grammar [select count(*) cnt from DUAL where exists 
                    (select null from ESRL_OBSERVATIONS where LOCATION = '/path1')];
nested exception is java.sql.SQLException: user lacks privilege or object 
    not found: DUAL
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我可以做些什么来解决这个问题?我正在使用Hibernate来创建模式 - 也许我可以在我的Hibernate属性中创建一个设置,它将支持Oracle样式语法?

fre*_*edt 7

如果将Hibernate 3.6与HSQLDB 2.0.1或更高版本一起使用,则可以sql.syntax_ora=true在连接URL上使用连接属性.这使DUAL表与其他一些Oracle特定语法一起使用.

对于主属性未涵盖的行为,您可能还需要一些连接属性.请参阅:http: //hsqldb.org/doc/2.0/guide/management-chapt.html#mtc_compatibility_oracle


Bal*_*ick 5

HSQL“Oracle 风格语法”也可以通过 SQL 命令启用

SET DATABASE SQL SYNTAX ORA TRUE
Run Code Online (Sandbox Code Playgroud)

12.30sql.syntax_ora=true正如 fredt 的回答中所建议的那样,它是该财产的替代品。在某些情况下可能更实用:可以在 HSQL 数据库启动后通过 JDBC 设置标志。