我正在执行这个查询:
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 库(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 调用getParameterMetaData()
Statement 的方法时抛出了错误。我仍然不确定如何解决这个问题。
我的临时解决方案是编辑 dbutils 库的源代码并禁用对getParameterMetaData()
(参见 AbstractQueryRunner.java 的第 196 行)的调用。它所做的只是检查传入的参数计数是否与查询中找到的相匹配,如果 != 则抛出错误。我可以跳过该检查,因为如果参数不匹配,查询无论如何都会失败。