【问题标题】:Use NamedParameterJdbcTemplate to update array field使用 NamedParameterJdbcTemplate 更新数组字段
【发布时间】:2009-11-01 19:38:59
【问题描述】:

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

我正在运行这样的代码:

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

namedJdbcTemplate.update("UPDATE myTable SET dblArrayFld = :myarray WHERE idFld = :myid", params);

这会返回一个错误,在“$2”或附近读取语法错误

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

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

这里的正确语法是什么?

【问题讨论】:

  • myDblArrayListVar 是什么类型?
  • 对不起,错过了:myDblArrayListVar is an ArrayList
  • 我期待这个答案,但想得到确认

标签: java postgresql jdbc parameterized jdbctemplate


【解决方案1】:

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

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

【讨论】:

  • 我认为 JDBC 可能将 createArrayOf 定义为标准,但 Postgres JDBC4 似乎不支持它。有什么好的选择吗?
  • 最新的 JDBC 可以。实际上,它确实有一段时间:jdbc.postgresql.org/changes.html#version_8.3-dev602
  • 如何访问 NamedParameterJdbcTemplate 中的 Connection?
  • 到目前为止我找不到解决方案。到目前为止,我发现的最好的可能性是使用 JdbcTemplate 和 PreparedStatementSetter,但随后我将不得不放弃使用命名参数。
  • @Sasa Array array = namedParameterJdbcTemplate.getJdbcOperations().execute(new ConnectionCallback<Array>() { @Override public Array doInConnection(Connection con) throws SQLException, DataAccessException { return con.createArrayOf("array type", arrayElements); } });
猜你喜欢
  • 2019-07-26
  • 2020-08-21
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多