2011-06-21 10 views
6

Mam następujący kod JDBC. Zauważ, że ja próbuje użyć PostGIS Geografia:Program PreparedStatement nie odczytuje wszystkich moich parametrów dla 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()); 
      ... 

otrzymuję następujący wyjątek w ostatnim wierszu kodu:

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

Rozumiem, że myśli mam tylko 2 parametry tam, ale możesz zobaczyć, że zamierzałem tam być 10. Nie jestem pewien, dlaczego nie czyta żadnego z parametrów w ramach POLYGON. Wiem, że to polecenie SQL działa, jeśli używam go bezpośrednio w bazie danych, ale nie jestem pewien, co muszę zmienić, aby działało w moim kodzie Java. Jakieś pomysły?

Odpowiedz

8

Twoim problemem jest to, że:

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

jest ciąg SQL dosłowne, że właśnie dzieje się zawierać osiem znaków zapytania. Ponieważ jest to literał łańcuchowy SQL, żaden ze znaków zapytania w nim nie jest uznawany za symbol zastępczy. To pozostawia dwa elementy zastępcze: ten na samym początku listy VALUES i ten na samym końcu.

Będziesz musiał zbudować swój wielokąt w inny sposób. Może być lepszy sposób niż ST_GeographyFromText, ale, niestety, nie wiem, co to jest i nie mam skonfigurowanego PostGIS w dowolnym miejscu. Jeśli to konieczne, można zbudować ciąg wielokąta ręcznie ze standardowym ciąg kłótni, a następnie użyć zastępczy dla niego:

VALUES (?, ST_GeographyFromText(?), ?) 

zastępczy wewnątrz ST_GeographyFromText będzie postrzegana jako miejsce, ponieważ nie jest wewnątrz łańcucha i dosłowny możesz użyć użytkownika stmt.setString, aby nadać mu wartość.

+0

Ach, rozumiem. Dziękuję za bardzo jasne wyjaśnienie. Doceniam to. – Steph

6

Jako mu jest zbyt krótki poprawnie powiedział problem polega na tym, że symbol zastępczy nie jest rozpoznawany wewnątrz wewnątrz cytatów.

W przypadku, gdy budowanie całego ciągu znaków w Javie nie jest możliwe (np. W moim przypadku było zbyt nachalne) można obejść problem, przenosząc symbol zastępczy poza literał, a następnie za pomocą operatora konkatenacji ciągów PgSQL, jak poniżej:

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

W twoim przypadku rozwiązaniem byłoby:

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

Nie bardzo czytelny, ale działa ...

Powiązane problemy