java - 我们可以在 jdbcTemplate 更新中使用 IN 子句吗?

标签 java sql-server spring-boot

public class Test{
  @Autowired
    private JdbcTemplate jdbcTemplate;

  public void updateData(List<String> rollNbr){
   MapSqlParameterSource parameters = new MapSqlParameterSource();
          parameters.addValue("rollNbr", rollNbr);
    String sql = "UPDATE students set marks=50 where rollNbr IN (:rollNbr)";
    jdbcTemplate.update(sql, parameters);
 }
  }    
}

当我使用卷号列表调用 updateData 方法时,出现以下错误:

org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [UPDATE students set marks=50 where rollNbr IN (:rollNbr)]; The index 1 is out of range.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110) ~[spring-jdbc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1402) ~[spring-jdbc-5.0.10.RELEASE.jar:5.0.10.RELEASE]

最佳答案

NamedParameterJdbcTemplate 解决了问题

更改:

public class Test{
  @Autowired
    private JdbcTemplate jdbcTemplate;

  public void updateData(List<String> rollNbr){
NamedParameterJdbcTemplate jdbcNamesTpl = new NamedParameterJdbcTemplate(this.jdbcTemplate);
   MapSqlParameterSource parameters = new MapSqlParameterSource();
          parameters.addValue("rollNbr", rollNbr);
    String sql = "UPDATE students set marks=50 where rollNbr IN (:rollNbr)";
    jdbcNamesTpl.update(sql, parameters);`
  }    
}

关于java - 我们可以在 jdbcTemplate 更新中使用 IN 子句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61962740/

相关文章:

java - 在不使用 JEditorPane 的情况下查看 Applet 内的 HTML

java - 打印多个类

java - Spring Boot创建自定义注释来获取登录用户?

java - JPA 存储库 findById 被 $$_hibernate_interceptor 拦截

java - Android ProgressDialog 不工作

java - 如何使用 rxJava 发出多重请求

sql - 为 t-sql 命名存储过程的最佳实践是什么?

sql-server - SQL Server 2005 中以句点分隔的字符串的自然顺序

sql - 删除重复的外键

java - 带标签的计数器 - 如何按维度/标签分组?