java commons dbutils:无法绑定多部分标识符
我正在执行此查询:java commons dbutils:无法绑定多部分标识符,java,sql,apache-commons-dbutils,Java,Sql,Apache Commons Dbutils,我正在执行此查询: 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) 当我直接在SQLServerManagementStudio中执行它时,它工作正常。 当我用标准的Java语句和结果集执行它时,它就工作了。 当我使用v1.5执行它时,我得到: Exception i
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)
当我直接在SQLServerManagementStudio中执行它时,它工作正常。
当我用标准的Java语句和结果集执行它时,它就工作了。
当我使用v1.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方法时抛出了错误。我仍然不确定如何解决这个问题
我的临时解决方案是编辑dbutils库的源代码并禁用对getParameterMetaData的调用,请参见AbstractQueryRunner.java的第196行。它所做的只是检查传入的参数计数是否与查询中找到的匹配,如果!=,则抛出错误。我可以跳过该检查,因为如果参数不匹配,查询仍将失败。如果查询不同,请检查表名并重新尝试
而它失败的那一个
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_问题,在另一个查询中为售前问题。
100%确保查询正常,表zz不需要任何别名。您可以删除此详细信息
可能是您使用的旧jdbc驱动程序
下载最新的驱动程序
尝试给出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
)
检查您的jdbc驱动程序,使用最新的libs。我有最新的sqljdbc4.jar驱动程序。正如我所说,查询本身是有效的。问题是getParameterMetaData抛出了一个错误。当我发布它时,不同的参数只是我试图简化查询名称。我有来自MS的最新驱动程序。更改1没有帮助。我添加了zz别名以进行一些故障排除。我知道这是不必要的,但没有它我也会遇到同样的错误。是的,简单的查询是有效的。任何不使用联接或嵌套选择从单个表中进行选择的操作都有效。有一个错误,我认为在使用别名的某些版本中已修复,这就是为什么我要求删除zz,请参阅线程确定。更多的调试。删除zz别名并更改后?对于1,它执行成功,getParameterMetaData工作正常。但这是一个问题,因为我更喜欢使用带有?的预处理语句来防止sql注入
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
)