首页 > 解决方案 > 无法将 setArray JDBC(整数)与 H2 数据库一起使用

问题描述

我想在带有 H2 数据库的 jdbc 查询中放入一个整数数组。

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 数据库。你能帮我吗?

标签: javaarraysjdbch2

解决方案


使用我的 JDBC 实用程序轻松处理 JDBC IN 数组参数:

1. 如果是 Maven,请将以下依赖项添加到您的 pom.xml

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

2.如果没有maven,下载这个jar文件

3. 修复你的代码(保证所有 DBMS 都有效)

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} );

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.setInt2("int_a", null_value);
stat.setString("str_b", str_value);
// ...

5. 一些注意事项

  • 支持的参数名称。不再 ?在您的查询中
  • Sql中的参数需要以:(如JPA参数)开头
  • IN Sql 中的数组参数必须是这种语法 IN :param_name

推荐阅读