JUnit / HSQLDB: как обойти ошибки с синтаксисом Oracle при тестировании с использованием HSQLDB (без привилегий и / или без объекта DUAL) - PullRequest
4 голосов
/ 07 января 2011

У меня есть код DAO, который содержит JDBC со специфичным для Oracle синтаксисом, например:

select count(*) cnt from DUAL 
where exists (select null from " + TABLE_NAME + "
              where LOCATION = '" + location + "')")

Я запускаю тесты JUnit для этого метода DAO с использованием базы данных HSQLDB в памяти.Очевидно, таблица 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

Может кто-нибудь предложить что-нибудь, что я могу сделать, чтобы обойти эту проблему?Я использую Hibernate для создания схемы - возможно, в моих свойствах Hibernate есть настройка, позволяющая поддерживать синтаксис стиля Oracle?

Ответы [ 4 ]

7 голосов
/ 07 января 2011

Если вы используете 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

4 голосов
/ 31 декабря 2013

HSQL «Синтаксис стиля Oracle» также можно включить с помощью команды SQL

SET DATABASE SQL SYNTAX ORA TRUE

См. 12.30 .Это альтернатива свойству sql.syntax_ora=true, как предлагается в ответе Фредта.В некоторых случаях это может быть более практичным: флаг может быть установлен через JDBC после запуска базы данных HSQL.

2 голосов
/ 07 января 2011

Создайте таблицу с именем DUAL с одним столбцом "DUMMY" в базе данных HSQLDB. Вставьте одну строку, значение «X».

0 голосов
/ 22 декабря 2016

Это старая ветка, но можно использовать пользовательский URL для установки диалекта оракула. Я создал собственную фабрику источника данных с обновленным URL-адресом и вставил ее при инициализации БД.

//Custom class
public class CusstomSimpleDriverDataSourceFactory implements DataSourceFactory {

    private final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();

    @Override
    public ConnectionProperties getConnectionProperties() {
        return new ConnectionProperties() {
            @Override
            public void setDriverClass(Class<? extends Driver> driverClass) {
                dataSource.setDriverClass(driverClass);
            }

            @Override
            public void setUrl(String url) {
                System.out.println("Existing url: " + url);
                String newUrl = url+";sql.syntax_ora=true";
                System.out.println("New url: " + newUrl);
                dataSource.setUrl(newUrl);
            }

            @Override
            public void setUsername(String username) {
                dataSource.setUsername(username);
            }

            @Override
            public void setPassword(String password) {
                dataSource.setPassword(password);
            }
        };
    }

    @Override
    public DataSource getDataSource() {
        return this.dataSource;
    }

}

Then in the configuration you can use
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
              .setType(EmbeddedDatabaseType.HSQL)
              .setDataSourceFactory(new CusstomSimpleDriverDataSourceFactory())
              .addScript("ddl_script") 
              .addScript("dml_script")
              .build();
    }
...