3

Java PreparedStatement を使用する場合、疑問符のプレースホルダーが検出されません。statementName .setLong(1, 123)を呼び出すと、「列インデックスが範囲外です: 1、列数: 0」というエラーがスローされます。私の例はPostgres 8.4のものですが、SQLがSQLサーバーに到達する前に問題が発生します。

いくつかの動作する準備済みステートメントと比較した後、壊れたステートメントに次のようなサブクエリが含まれていることに気付きました。

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

2 に答える 2

1

私にとってうまくいった解決策は、クエリを CTE (Common Table Expression) に変換することでした。修正されたクエリは次のようになります。

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

SELECT * 
FROM Level1
ORDER BY 1
于 2013-04-03T23:54:06.353 に答える
0

JDBC では、準備済みステートメントのパラメーター インデックスは 0 ではなく 1 から始まります。

于 2013-04-03T23:58:37.887 に答える