在HSQLDB的changelog,各国ROWNUM()在加入v2.2.0其竞选对手在内存中的HSQLDB集成测试时,我使用没有任何问题.
但是我想对真正的Oracle 10g数据库运行相同的测试,但查询失败,因为调用了伪列ROWNUM.是否有一种简单的方法可以编写在两种环境中都有效的单个查询字符串?
我在执行单元测试时遇到了Hibernate的问题,这是我得到的问题:
org.springframework.dao.InvalidDataAccessResourceUsageException:
user lacks privilege or object not found: ROWNUM; SQL [n/a];
nested exception is org.hibernate.exception.SQLGrammarException:
user lacks privilege or object not found: ROWNUM
....
Caused by: org.hsqldb.HsqlException:
user lacks privilege or object not found: ROWNUM
Run Code Online (Sandbox Code Playgroud)
我正在使用 :
<hibernate.version>4.1.0.Final</hibernate.version>
<hsqldb.version>2.3.3</hsqldb.version>
我正在测试的功能在生产环境中完美地工作,但我不知道为什么在我测试它时并非如此.
以下是引发错误的测试函数:
@Override
public EvaluationCriteria findByCriteriaIdAndEvaluationId(Long evaluationId, Long criteriaId) {
JPAQuery query = new JPAQuery(getEntityManager());
QEvaluationCriteria evaluationCriteria = QEvaluationCriteria.evaluationCriteria;
return query.from(evaluationCriteria)
.where(evaluationCriteria.evaluation.id.eq(evaluationId))
.where(evaluationCriteria.criteria.id.eq(criteriaId))
.singleResult(evaluationCriteria);
}
Run Code Online (Sandbox Code Playgroud)
我的测试:
@Test
public void findByCriteriaIdAndEvaluationId() {
Long evaluationId = (long)1;
Long criteriaId = (long)1;
EvaluationCriteria …Run Code Online (Sandbox Code Playgroud) 我有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样式语法?