【发布时间】:2014-01-12 18:59:59
【问题描述】:
我正在执行这个查询:
SELECT psq_id, question_text
FROM presales_question
WHERE psq_id IN(SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = 1)
当我直接在 SQL Server Management Studio 中执行它时,它可以工作。
当我使用标准 Java 语句和结果集执行它时,它可以工作。
当我使用Apache Commons DBUtils library (v 1.5) 执行它时,我得到:
Exception in thread "main" java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "zz.ps_id" could not be bound. Query: SELECT psq_id, question_text FROM presales_question WHERE psq_id IN(SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ?) Parameters: [1]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:363)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:350)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:211)
看来问题不在于查询,而在于 dbutils 库。挖掘源代码,我看到当 dbutils 调用 Statement 的 getParameterMetaData() 方法时会引发错误。我仍然不确定如何解决这个问题。
我的临时解决方案是编辑 dbutils 库的源代码并禁用对 getParameterMetaData() 的调用(参见 AbstractQueryRunner.java 的第 196 行)。它所做的只是检查传入的参数计数是否与查询中找到的相匹配,如果 != 则抛出错误。我可以跳过该检查,因为如果参数不匹配,查询无论如何都会失败。
【问题讨论】:
-
检查你的 jdbc 驱动,使用最新的库。
-
我有最新的 sqljdbc4.jar 驱动程序。就像我说的,查询本身有效。问题是 getParameterMetaData() 抛出错误。
标签: java sql apache-commons-dbutils