Поддерживает ли HSQLDB setArray для предикатов в запросах? - PullRequest
0 голосов
/ 11 апреля 2020

Предположим, что вы хотите выполнить запрос, такой как следующий, для экземпляра HSQLDB через соединение JDB C:

select * from employees where lastname in ('Stauder', 'Brugger', 'Wieser');

Задача: список имен различается (количество значений, а также сами значения), и мы хотим использовать PreparedStatement.

Согласно этому ответу , правильный способ сделать это будет:

PreparedStatement statement = connection.prepareStatement(
    "select * from employees where lastname in (?)");
/* modify the following line to determine the values dynamically */
Array array = statement.getConnection().createArrayOf("VARCHAR",
    new Object[]{"Stauder", "Brugger", "Wieser"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();

Однако комментарии указывают, что не все драйверы JDB C поддерживают это. HSQLDB docs говорит, что начиная с версии 2.0 поддерживается setArray(), но мне неясно, означает ли это, что приведенный выше пример будет работать, особенно с использованием этой конструкции с предикатом in. Кто-нибудь может пролить свет на это?

1 Ответ

3 голосов
/ 11 апреля 2020

Возьмите прямо из Документация HSQLDB , вот как вы должны это сделать. (Майор подпирает @fredt, так как он действительно получил полный правильный ответ).

 String sql = "select * from employees where lastname in ( UNNEST(?) )";
 PreparedStatement ps = connection.prepareStatement(sql)
 Object[] data = new Object[]{"Stauder", "Brugger", "Wieser"};
 // default types defined in org.hsqldb.types.Type can be used
 org.hsqldb.types.Type type = org.hsqldb.types.Type.SQL_VARCHAR_DEFAULT;
 JDBCArrayBasic array = new JDBCArrayBasic(data, type);
 ps.setArray(1, array);
 ResultSet rs = ps.executeQuery();
...