Apache DBUtils queryRunner - where in 子句
Apache DBUtils queryRunner - where in clause
我正在尝试使用 SQL 服务器数据库上的查询运行ner 接口从列表中检索多条记录。似乎接口抛出错误,而正常方法有效。
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();
*/
}
这似乎是一种正常的方法,我可以单独设置参数。但是,我想使用 query运行ner 接口,因为我的项目 运行s 所有查询都使用这个接口。我做错了什么吗?
进一步调试dbutils导致错误信息
线程 "main" java.sql.SQLException 中的异常:
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ','. Query: SELECT ID from Document where Id IN (?, ?, ?) Parameters: [015190000000vojAAA, 015190000000vokAAA, 015190000000volAAA]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:351)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:212)
at com.commvault.db.dao.DBUtil.select(DBUtil.java:160)
at com.commvault.test.Test.testMethod(Test.java:264)
at com.commvault.test.Test.main(Test.java:80)
与 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 是一个自定义包装器 class,它包含其他实用方法并将 QueryRunner 作为私有变量。
Apache DbUtils 没问题,但 Microsoft JDBC 驱动程序有一个错误(至少在版本 4 中):
当您为在 IN 子句中包含参数的 SQL 命令创建 PreparedStatement
时
SELECT ID from Document where Id IN (?, ?, ?)
并调用 PreparedStatement.getParameterMetaData()
驱动程序引发异常抱怨语法错误。现在不幸的是 DbUtils
在设置参数之前调用了这个方法。
这已被观察到 。
我正在尝试使用 SQL 服务器数据库上的查询运行ner 接口从列表中检索多条记录。似乎接口抛出错误,而正常方法有效。
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();
*/
}
这似乎是一种正常的方法,我可以单独设置参数。但是,我想使用 query运行ner 接口,因为我的项目 运行s 所有查询都使用这个接口。我做错了什么吗?
进一步调试dbutils导致错误信息 线程 "main" java.sql.SQLException 中的异常:
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ','. Query: SELECT ID from Document where Id IN (?, ?, ?) Parameters: [015190000000vojAAA, 015190000000vokAAA, 015190000000volAAA]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:351)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:212)
at com.commvault.db.dao.DBUtil.select(DBUtil.java:160)
at com.commvault.test.Test.testMethod(Test.java:264)
at com.commvault.test.Test.main(Test.java:80)
与 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 是一个自定义包装器 class,它包含其他实用方法并将 QueryRunner 作为私有变量。
Apache DbUtils 没问题,但 Microsoft JDBC 驱动程序有一个错误(至少在版本 4 中):
当您为在 IN 子句中包含参数的 SQL 命令创建 PreparedStatement
时
SELECT ID from Document where Id IN (?, ?, ?)
并调用 PreparedStatement.getParameterMetaData()
驱动程序引发异常抱怨语法错误。现在不幸的是 DbUtils
在设置参数之前调用了这个方法。
这已被观察到