我執行這個查詢:java的公共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)
當我在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驅動程序,使用最新的libs。 – MrSimpleMind
我有最新的sqljdbc4.jar驅動程序。就像我說的那樣,查詢本身起作用。問題是getParameterMetaData()拋出一個錯誤。 – bradvido