2011-06-21 11 views
6

次のJDBCコードがあります。私はそれが私が唯一そこに2つのパラメータを持っていると考えていることを理解PreparedStatementがPostGIS地理のすべてのパラメータを読み取っていません

org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2. 

、しかし:

PreparedStatement stmt = db.prepareStatement("INSERT INTO " + 
        "source_imagery (image_path, boundary, image_time)" + 
        " VALUES (?, ST_GeographyFromText('POLYGON((" + 
        "? ?, ? ?, ? ?, ? ?))'), ?)"); 

      stmt.setString(1, file.getAbsolutePath()); 
      stmt.setDouble(2, bounds.getY()); 
      stmt.setDouble(3, bounds.getX()); 
      ... 

私は、コードの最後の行に次の例外を取得しています:私は、PostGISの地理を使用しようとしていることに注意してくださいあなたはそこに私が10であることを意図しているのを見ることができます。私はPOLYGONの中のパラメータを読んでいないのはなぜわかりません。私は、このSQL文がデータベースで直接使用されている場合には動作することを知っていますが、Javaコードで動作させるために何を変更する必要があるのか​​分かりません。何か案は?

答えて

8

あなたの問題は、このことです:

'POLYGON((? ?, ? ?, ? ?, ? ?))' 

はわずか8疑問符が含まれているために起こることをSQL文字列リテラルです。これはSQL文字列リテラルなので、その内部の疑問符はプレースホルダとみなされません。 2つのプレースホルダーがあります:VALUESリストの最初の部分と最後の部分です。

多角形を別の方法で構築する必要があります。 ST_GeographyFromTextより良い方法があるかもしれませんが、悲しいかな、私はそれが何であるかわからないし、どこにでもPostGISを設定していない。必要であれば、あなたは論争標準の文字列を手でPOLYGON文字列を作成し、それのためのプレースホルダを使用することができます:それは文字列リテラルの内側ではないよう

VALUES (?, ST_GeographyFromText(?), ?) 

ST_GeographyFromText内のプレースホルダは、プレースホルダとして見られることになり、ユーザーにはstmt.setStringという値を付けることができます。

+0

ああ、私は理解しています。非常に明確な説明をありがとうございます。それは有り難いです。 – Steph

6

muが短すぎる正しくは、プレースホルダが引用符の内側で認識されないということです。

Javaで文字列全体を構築することはできません(私の場合、あまりにも邪魔になります)。プレースホルダをリテラルの外に移動して、PgSQL文字列連結演算子を使用すると、

ST_GeographyFromText('SRID=4326;POINT(' || ? || ' ' || ? || ')') 

ソリューションは以下のようになり、あなたの場合:

ST_GeographyFromText('POLYGON((' || ? || ' ' || ? || ', ' || ? || ' ' || ? || 
    ', ' || ? || ' ' || ? || ', ' || ? || '' || ? || '))') 

ない非常に読みやすいが、それは動作します...

関連する問題