2013-04-03 19 views
3

使用Java PreparedStatement時,未檢測到問號佔位符。當調用statementName .setLong(1,123)時,它會引發錯誤「列索引超出範圍:1,列數:0」。我的例子來自Postgres 8.4,但問題發生在SQL有機會讓它到SQL服務器之前。Java PreparedStatement無法識別子查詢中的佔位符

對一些工作準備語句比較後,我意識到,破一個包含一個子查詢類似於:

SELECT * FROM ( 
    SELECT DISTINCT (name) 
    id, 
    name 
    FROM MyTable 
    WHERE id > ? 
    ORDER BY name) AS Level1 
ORDER BY 1 
+0

什麼PgJDBC版本? – 2013-04-03 23:54:37

+0

發佈拋出異常的java代碼塊,而不僅僅是查詢。查詢是可以的,但問題可能與您編寫java代碼的方式相同 – Barranka 2013-04-03 23:57:55

+0

參數的索引是基於1的。 – David 2013-04-03 23:57:56

回答

1

爲我工作的解決方案是將查詢轉換爲CTE(公共表表達式) 。修訂後的查詢看起來是這樣的:

WITH Level1 AS ( 
    SELECT DISTINCT (name) 
    id, 
    name 
    FROM MyTable 
    WHERE id > ? 
    ORDER BY name) 

SELECT * 
FROM Level1 
ORDER BY 1 
+0

好吧,事情變得更怪異。通過剝離所有Eclipse自動插入的\ r \ n轉義碼,我能夠在另一個冗長的查詢字符串上重現此問題。這也不是空間填充問題,因爲用空格替換\ r \ n並不能解決問題。 – scottwed 2013-04-04 22:16:56

+0

好的,這看起來越來越像一個解析錯誤。將 - \ r \ n附加到SQL查詢的第一行的末尾會導致問題消失。 – scottwed 2013-04-04 22:24:52

0

在JDBC中的參數指標爲準備好的發言開始時的1而不是0