第一种情况可能是真的参数不匹配,需要检查一下参数个数。
第二种情况
private QueryRunner run = new QueryRunner(DataSourceUtils.getDataSource(), true);
创建QueryRunner对象时需要加入参数true,就可以解决问题。
public QueryRunner(DataSource ds, boolean pmdKnownBroken) {
super(ds, pmdKnownBroken);// 第二个参数表示不会尝试调用getParameterMetaData()方法
// 在有些数据库中不支持ParameterMetaData,比如Oracle
}
问题就出在这个地方,org.apache.commons.dbutils.AbstractQueryRunner 的fillStatement方法
// check the parameter count, if we can
ParameterMetaData pmd = null;
if (!pmdKnownBroken) {
pmd = stmt.getParameterMetaData();
int stmtCount = pmd.getParameterCount();
int paramsCount = params == null ? 0 : params.length;
if (stmtCount != paramsCount) {
throw new SQLException("Wrong number of parameters: expected "
+ stmtCount + ", was given " + paramsCount);
}
}