2011-06-21 12 views
6

Tengo el siguiente código JDBC. Nótese que estoy intentando utilizar PostGIS geografía:PreparedStatement no está leyendo todos mis parámetros para PostGIS Geography

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()); 
      ... 

estoy recibiendo la siguiente excepción en la última línea de código:

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

entiendo que piensa que sólo tengo 2 parámetros allí, pero puede ver que tenía la intención de ser 10. No estoy seguro de por qué no está leyendo ninguno de los parámetros dentro del POLYGON. Sé que esta declaración SQL funciona si la uso directamente en la base de datos, pero no estoy seguro de qué tengo que cambiar para que funcione en mi código Java. ¿Algunas ideas?

Respuesta

8

Su problema es que esto:

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

es una cadena SQL literal que sólo que contiene ocho signos de interrogación. Como se trata de un literal de cadena SQL, ninguno de los signos de interrogación que contiene se considera marcadores de posición. Eso te deja con dos marcadores de posición: el que está al principio de la lista VALUES y el que está al final.

Tendrá que construir su polígono de otra manera. Puede haber una forma mejor que ST_GeographyFromText pero, ay, no sé qué es y no tengo PostGIS configurado en ningún lado. Si es necesario, se puede construir la cadena POLÍGONO a mano con cadena estándar discusiones y luego usar un marcador de posición para que:

VALUES (?, ST_GeographyFromText(?), ?) 

El marcador de posición en el interior ST_GeographyFromText será visto como un marcador de posición, ya que no está dentro de una cadena literal y podrías usar stmt.setString para darle un valor.

+0

Ah, entiendo. Gracias por la explicación muy clara. Lo aprecio. – Steph

6

Como mu es demasiado corto dijo correctamente que el problema es que el marcador de posición no se reconoce dentro de las comillas.

En caso de que la cadena entera en Java no sea posible (por ejemplo, en mi caso era demasiado intrusiva) puede solucionar el problema moviendo el marcador fuera del literal y luego usando el operador de concatenación de cadenas PgSQL, como este:

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

En su caso, la solución sería:

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

No es muy fácil de leer, pero funciona ...

Cuestiones relacionadas