我使用JDBI将一些数据插入到具有自动增量主键的mysql表中。我使用索引来进行插入。代码如下所示:
public void insertWorkout(String[] values) {
String insertString = "insert into workouts(<column_names>) values(:0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31)";
Update pUpdate = handle.createStatement(insertString);
for(int i=0; i<vals.length;i++) {
pUpdate.bind(i, vals[i]);
}
pUpdate.execute();
}这已经很好地工作了一段时间,因为values[]总是正确的计数(32),并且参数总是保持相同的顺序。现在,它将不得不处理被传递的一个较小的数组(18,19,或20),并且仍然正确地执行插入;最后14个左右的args可以是空的,也可以是空的。值的顺序仍然是静态的(即,如果传递18列,它是表中的前18列),最后20列都是int(11)列。
现在,当它传递一个小于32的数组时,它会产生如下错误:
org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: Unable to execute, no named parameter matches "20" and no positional param for place 20 (which is 21 in the JDBC 'start at 1' scheme) has been set. 解决这个问题的最好方法是什么?
发布于 2014-01-25 05:45:11
只要列排序是静态的,并且缺少的列都是DB中的int类型,您就应该能够为每个剩余的缺失参数绑定一个null。像这样的事情应该有效:
String insertString = "insert into workouts....."
Update pUpdate = handle.createStatement(insertString);
for(int i=0; i<vals.length;i++) {
pUpdate.bind(i, vals[i]);
}
if (values.length < 32) {
for(int i =(32 - values.length); i<32;i++) {
pUpdate.bindNull(i, java.sql.Types.INTEGER);
}
}
pUpdate.execute();也就是说,最好用名称来绑定每个参数,而不是使用索引。
https://stackoverflow.com/questions/21347091
复制相似问题