将插入与 KeyHolder 一起使用时出现 ArrayIndexOutOfBoundsException
Posted
技术标签:
【中文标题】将插入与 KeyHolder 一起使用时出现 ArrayIndexOutOfBoundsException【英文标题】:ArrayIndexOutOfBoundsException when using insert with KeyHolder 【发布时间】:2018-11-11 11:42:38 【问题描述】:有一个例子,适用于这个版本:
String sql = "insert into album (name) VALUES (:name)";
Object[] params = new Object[] al.getName() ;
jdbcTemplate.update(sql, params);
并在此版本中给出 ArrayIndexOutOfBoundsException:
KeyHolder holder = new GeneratedKeyHolder();
String sql = "insert into album (name) VALUES (:name)";
Object[] params = new Object[] al.getName() ;
jdbcTemplate.update(sql, params, holder);
附加信息:
@Autowired
public void setDataSource(DataSource dataSource)
this.jdbcTemplate = new JdbcTemplate(dataSource);
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.sqlite.JDBC"></property>
<property name="url" value="jdbc:sqlite:db/springDB.db"></property>
<property name="username" value=""></property>
<property name="password" value=""></property>
</bean>
有一个堆栈跟踪:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at org.sqlite.core.CorePreparedStatement.batch(CorePreparedStatement.java:128)
at org.sqlite.jdbc3.JDBC3PreparedStatement.setObject(JDBC3PreparedStatement.java:388)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:402)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:166)
at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.doSetValue(ArgumentPreparedStatementSetter.java:66)
at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.setValues(ArgumentPreparedStatementSetter.java:47)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:914)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:909)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:909)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:970)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:980)
at com.user.impls.SQLiteDAO.insertAlbum(SQLiteDAO.java:214)
at com.user.app.Start.main(Start.java:34)
这里有什么问题?好像没有错误。第一个版本插入数据并创建一个 id。但第二个给出错误。谢谢
【问题讨论】:
你能发布堆栈跟踪吗? 是的,当然,我会编辑问题并添加堆栈跟踪 您使用的是哪个版本的 Spring 和哪个版本的 sqlite?另外,请发帖minimal reproducible example。目前还不清楚jdbcTemplate
是什么类型,JdbcTemplate
或NamedParameterJdbcTemplate
,尽管堆栈跟踪建议JdbcTemplate
;这可能是问题所在。尝试使用?
而不是:name
Spring 版本 4.0.3 和 SqLite 版本 3.24.0。好的,我已经添加了更多信息。
@MarkRotteveel 你提到,JdbcTemplate 可能有问题,我尝试了 NamedParameterJdbcTemplate 并且它有效。谢谢,所以这个问题解决了。我不知道如何将评论作为解决方案投票。
【参考方案1】:
因此,正如Mark Rotteveel 建议的那样,使用 NamedParameterJdbcTemplate 而不是 JdbcTemplate 可以解决问题。
【讨论】:
以上是关于将插入与 KeyHolder 一起使用时出现 ArrayIndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章
将 Typescript 与 React-Redux 一起使用时出现类型错误
将 Firebase 与 RecyclearView 一起使用时出现错误
将 QuerydslPredicateExecutor 与 JpaRepository 一起使用时出现 IllegalAccessException