Exception:java.sql.SQLException: ORA-00904: … : 标识符无效
DbUtils使用Oracle查询时获取stmt.getParameterMetaData()出现异常AbstractMethodError
解决:
创建QueryRunner时,pmdKnownBroken设置为true,错误解决。
分析原因:
Some drivers don’t support {@link ParameterMetaData#getParameterType(int) }
(Orcale不支持获取参数元数据)
通过查看QueryRunner源代码:
/**
* Constructor for QueryRunner that takes a <code>DataSource</code> and controls the use of <code>ParameterMetaData</code>.
* Methods that do not take a <code>Connection</code> parameter will retrieve connections from this
* <code>DataSource</code>.
*
* @param ds The <code>DataSource</code> to retrieve connections from.
* @param pmdKnownBroken Some drivers don't support {@link java.sql.ParameterMetaData#getParameterType(int) };
* if <code>pmdKnownBroken</code> 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();
...
...
}
这样,不支持元数据的数据库就不会调用获取元数据的方法。