使用Spring jdbctemplate执行更新操作

3
请建议一些使用jdbctemplate执行以下查询的方法。
update student set result='pass' where stud_id in (100,101,102);

我尝试了以下方法,但遇到了无效的列类型问题。 我正在传递以下内容:
String query = "UPDATE STUDENT SET RESULT = ? WHERE OBJ_ID IN ( SELECT * FROM TABLE )";
int[] stud_ids = new int[]{100,101,102};

  getJdbcTemplate().query(updateStateSQL, new PreparedStatementSetter() {

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {
      final Connection con = getJdbcTemplate().getNativeJdbcExtractor().getNativeConnection(ps.getConnection());
      ps.setString(1, 'PASS');
      ps.setArray(2, stud_ids);
    }
  }, new RowMapper<String>() {

    @Override
    public String mapRow(ResultSet rs, int arg1) throws SQLException {
      return rs.getString(1);
    }
  });
}

1
дҪ еә”иҜҘеңЁJdbcTemplateдёӯдҪҝз”Ёupdate()ж–№жі•иҖҢдёҚжҳҜquery()ж–№жі•гҖӮ - CodeChimp
我也尝试使用update(),但是出现了相同的错误。 - Ranjith Sekar
什么是错误信息? - janos
UPDATE 和 DELETE 不能使用 query(),因为它们不会查询任何内容,也不会返回结果集。您必须使用 update()。如果出现错误,则显示错误消息和堆栈跟踪。这样更容易帮助您。另外,为什么要使用使用 PreparedStatement 的更复杂的 query/update 形式呢?您有一个只有两个参数的超级简单的 SQL 更新命令,为什么不使用接受字符串和参数列表的形式?这将极大地简化您的代码。实际上,为什么不使用 SimpleJdbcTemplate - CodeChimp
1个回答

1

你写道:

String query = "UPDATE STUDENT SET RESULT = ? WHERE OBJ_ID IN ( SELECT * FROM TABLE )";

getJdbcTemplate().query(updateStateSQL, ...)

您没有编写updateStateSQL的值。如果它与query相同,则无法工作:

ps.setString(1, 'PASS');
ps.setArray(2, stud_ids);

因为您需要在查询中使用两个问号(?),而您的帖子中只有一个。
您可以尝试这样做:
String query = "UPDATE STUDENT SET RESULT = ? WHERE OBJ_ID IN ( ? )";

但是说实话,我从未使用过ps.setArray,我不确定它是否能够达到你的期望。

应该可行的方法是使用NamedParameterJdbcTemplate,类似于这样:

String sql = "UPDATE STUDENT SET RESULT = :result WHERE OBJ_ID IN ( :ids )";
Map<String, Object> params = new HashMap<String, Object>();
params.put("result", "PASS");
params.put("ids", Arrays.asList(new Integer[] {100, 101, 102}));
getSimpleJdbcTemplate().update(sql, params);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接