我正在执行此查询:

 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行)。它所做的只是检查传入的参数计数与查询中找到的参数计数是否匹配,如果!=则抛出错误。我可以跳过该检查,因为如果参数不匹配,查询仍然会失败。

最佳答案

您的查询有所不同,请检查表名称并重新尝试。

SELECT psq_id, text
FROM ps_question
WHERE psq_id IN (
  SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = 1
)


而它失败了

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 = ?
)



您在第一个文本中输入文本,然后在第二个文本中输入问题文本。
表名称在第一个查询中为ps_question,在另一个查询中为presales_question。


100%确保查询正常,表zz不需要任何别名。您可以删除此详细信息。



可能是您使用的旧的jdbc驱动程序。

下载最新的驱动程序,

http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774



尝试给1并再次运行查询,它将运行吗?还是会失败?

改变?到1

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 = ? <-- change 1
)

关于java - Java Commons dbutils:不能绑定(bind)多部分标识符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21078914/

10-12 19:21