创建QueryRunner时,pmdKnownBroken设置为true,错误解决。
Some drivers don’t support {@link ParameterMetaData#getParameterType(int) }
(Orcale不支持获取参数元数据)
通过查看QueryRunner源代码:
/**
* Constructor for QueryRunner that takes a DataSource
and controls the use of ParameterMetaData
.
* Methods that do not take a Connection
parameter will retrieve connections from this
* DataSource
.
*
* @param ds The DataSource
to retrieve connections from.
* @param pmdKnownBroken Some drivers don't support {@link java.sql.ParameterMetaData#getParameterType(int) };
* if pmdKnownBroken
is set to true, we won't even try it; if false, we'll try it,
* and if it breaks, we'll remember not to use it again.
*/
public QueryRunner(DataSource ds, boolean pmdKnownBroken) {
super(ds, pmdKnownBroken);
}
看到@param pmdKnownBroken Some drivers don't support {@link java.sql.ParameterMetaData#getParameterType(int) };
,就知道了,很不幸!Oracle就是众多的Some之一。也就是说,Oracle不支持获取参数元数据。
我们就需要在创建QueryRunner时,告诉他我们的数据库是不支持的,this.fillStatement(stmt, params);
这个是填充preparedStatement的。这个方法中有这么一段
if (!pmdKnownBroken) {
pmd = tmt.getParameterMetaData();
...
...
}
这样,不支持元数据的数据库就不会调用获取元数据的方法。