Java apachedbutils queryRunner-where-in子句
我正在尝试使用SQL Server数据库上的queryrunner接口从列表中检索多个记录。似乎接口在正常方法工作时抛出错误Java apachedbutils queryRunner-where-in子句,java,sql-server,apache-commons-dbutils,Java,Sql Server,Apache Commons Dbutils,我正在尝试使用SQL Server数据库上的queryrunner接口从列表中检索多个记录。似乎接口在正常方法工作时抛出错误 private void testMethod() throws Exception { List<Object> strList = new ArrayList<Object>(); strList.add("015190000000vojAAA"); strList.add("015190000000vokAAA");
private void testMethod() throws Exception
{
List<Object> strList = new ArrayList<Object>();
strList.add("015190000000vojAAA");
strList.add("015190000000vokAAA");
strList.add("015190000000volAAA");
try (DBUtil dbUtil = new DBUtil())
{
String theQuery = "SELECT ID from Document where Id IN (?, ?, ?)";
for (Object[] row : dbUtil.queryRunner.select(theQuery, new ArrayListHandler(),
strList.toArray(new Object[strList.size()])))
{
logger.info(row[0]);
}
/*
* Normal method
* PreparedStatement prepareStatement = dbUtil.connection.prepareStatement(theQuery);
prepareStatement.setString(1, (String)strList.get(0));
prepareStatement.setString(2, (String)strList.get(1));
prepareStatement.setString(3, (String)strList.get(2));
ResultSetMetaData metaData = prepareStatement.getMetaData();
logger.info(metaData.getColumnCount());
ResultSet rs = prepareStatement.executeQuery();
while(rs.next())
{
logger.info(rs.getString(1));
}
prepareStatement.close();
*/
}
关于Dbutils的代码是下面的第225行
/* */ public void fillStatement(PreparedStatement stmt, Object[] params)
/* */ throws SQLException
/* */ {
/* 223 */ ParameterMetaData pmd = null;
/* 224 */ if (!(this.pmdKnownBroken)) {
/* 225 */ pmd = stmt.getParameterMetaData();
/* 226 */ int stmtCount = pmd.getParameterCount();
/* 227 */ int paramsCount = (params == null) ? 0 : params.length;
/* */
/* 229 */ if (stmtCount != paramsCount) {
/* 230 */ throw new SQLException("Wrong number of parameters: expected " + stmtCount + ", was given " + paramsCount);
/* */
/* */ }
/* */
/* */ }
/* */
当我手动运行时,同一行正常工作
编辑:DBUtil是一个自定义包装类,它包含其他实用程序方法,并包含QueryRunner作为私有变量。Apache DbUtils正常,但Microsoft JDBC驱动程序有一个bug(至少在版本4中): 为包含in子句中参数的SQL命令创建
PreparedStatement
时
SELECT ID from Document where Id IN (?, ?, ?)
并调用PreparedStatement.getParameterMetaData()
驱动程序引发异常,抱怨语法错误。不幸的是,DbUtils
在设置参数之前调用此方法
已经观察到了这一点。Mine是一个包装类DbUtil,它包含其他方法。我指的是这种方法
SELECT ID from Document where Id IN (?, ?, ?)