使用 NamedParameterJdbcTemplate 更新数组字段

Mar*_*iot 2 java postgresql jdbc parameterized jdbctemplate

dblArrayFld在表中有一个双精度数组字段myTable,我想使用 Spring 更新它NamedParameterJdbcTemplate(我使用的是 Postgres)。

我正在运行这样的代码:

SqlParameterSource params = (new MapSqlParameterSource())
        .addValue("myarray", myDblArrayListVar)
        .addValue("myid", 123);

namedJdbcTemplate.update("UPDATE myTable SET dblArrayFld = :myarray WHERE idFld = :myid", params);
Run Code Online (Sandbox Code Playgroud)

这将返回一个错误,读取“$2”处或附近的语法错误

我假设我的 :myarray 语法在这里有问题。我还尝试:myarray通过以下方式封装:

  • dblArrayFld={:myarray}
  • dblArrayFld={ :myarray }
  • dblArrayFld=[:myarray]
  • dblArrayFld=ARRAY[:myarray]
  • dblArrayFld=(:myarray)

这里的正确语法是什么?

Chs*_*y76 5

当您尝试将集合或数组绑定为命名参数时,NamedParameterJdbcTemplate将语句中适当的命名参数分解为多个与数组/集合长度匹配的位置参数。这对WHERE column IN (:param)语句很有用,但在这种情况下不起作用。

为了设置实际的 Postgres 数组,您必须将参数提供为java.sql.Array. 您可以使用Connection#createArrayOf()方法创建其实例。

  • @Sasa `Array array = namedParameterJdbcTemplate.getJdbcOperations().execute(new ConnectionCallback<Array>() { @Override public Array doInConnection(Connection con) throws SQLException, DataAccessException { return con.createArrayOf("array type", arrayElements); } });` (2认同)