Невозможно использовать setArray JDBC (целое число) с базой данных H2 - PullRequest
1 голос
/ 14 мая 2019

Я хочу поместить массив целых чисел в мой запрос jdbc с базой данных H2.

Integer[] list = new Integer[]{1,2,3};
            String query = "SELECT EXAMPLE FROM DATA WHERE EXAMPLE IN (?)";
            PreparedStatement ps = GestionBDD.getConexionBD().prepareStatement(query);
            Array array = GestionBDD.getConexionBD().createArrayOf("int", list);

            ps.setArray(1, array);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                // DO THINGS 
            }

Но не работает, я получаю это исключение: org.h2.jdbc.JdbcSQLException: Ошибка преобразования данныхпреобразование "(1,2,3)";Оператор SQL:

Я использую базу данных H2.Можете ли вы помочь мне, пожалуйста?

1 Ответ

1 голос
/ 29 мая 2019

Работать с параметром массива JDBC IN сложно.Это сложнее, если вы хотите, чтобы ваш запрос работал во всех СУБД.Вот почему я создал утилиты JDBC для более удобной работы с параметрами массива JDBC IN.

1.Если Maven, добавьте приведенную ниже зависимость в ваш pom.xml

    <dependency>
      <groupId>com.appslandia</groupId>
      <artifactId>appslandia-common</artifactId>
      <version>6.8</version>
    </dependency>

2.Если нет maven, скачать этот файл jar

3.Исправьте ваш код (Работает все СУБД гарантировано)

static final Sql EXAMPLE_SQL 
          = new Sql("SELECT EXAMPLE FROM DATA WHERE EXAMPLE IN (@example_array)");

StatementImpl stat = new StatementImpl(GestionBDD.getConexionBD(), EXAMPLE_SQL);

stat.setIntArray("example_array", new int[] {1, 2, 3} );
// OR stat.setIntArray("example_array", 1, 2, 3);

ResultSet rs = stat.executeQuery();

while (rs.next()) {
    // DO THINGS 
}

rs.close(); stat.close();

4.Не входящие в массив параметры

final Sql sampleSql 
       = new Sql("SELECT * FROM Table WHERE a=@int_a AND b=@str_b)

StatementImpl stat = new StatementImpl(conn, sampleSql);

stat.setInt("int_a", int_value);
stat.setString("str_b", not_null_string_value);
stat.setString2("str_b", null_or_string_value);
// setLong, setFloat, setDouble, setDate, ...

5.Некоторые примечания

  • Имя параметра поддерживается.Больше не надо ?в вашем запросе
  • Параметр в Sql нужно начинать с @ (как Ado.NET)
  • IN Параметр массива в Sql должен быть в этом синтаксисе IN (@param_name)
...