PreparedStatement не читает все мои параметры для PostGIS Geography - PullRequest
6 голосов
/ 22 июня 2011

У меня есть следующий код JDBC. Обратите внимание, что я пытаюсь использовать географию PostGIS:

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

Я получаю следующее исключение в последней строке кода:

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

Я понимаю, что он думает, что у меня там только 2 параметра, но вы можете видеть, что я предполагал, что их будет 10. Я не уверен, почему он не читает ни один из параметров в POLYGON. Я знаю, что этот оператор SQL работает, если я использую его непосредственно в базе данных, но я не уверен, что мне нужно изменить, чтобы он работал в моем коде Java. Есть идеи?

Ответы [ 2 ]

8 голосов
/ 22 июня 2011

Ваша проблема в том, что это:

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

- это строковый литерал SQL, который содержит восемь знаков вопроса. Поскольку это строковый литерал SQL, ни один из вопросительных знаков внутри него не считается заполнителем. Таким образом, у вас останется два заполнителя: один в самом начале списка VALUES и один в самом конце.

Вы должны будете построить свой многоугольник другим способом. Возможно, есть лучший способ, чем ST_GeographyFromText, но, увы, я не знаю, что это такое, и у меня нигде не настроен PostGIS. При необходимости вы можете построить строку POLYGON вручную с помощью стандартного преобразования строк, а затем использовать для нее заполнитель:

VALUES (?, ST_GeographyFromText(?), ?)

Заполнитель внутри ST_GeographyFromText будет рассматриваться как заполнитель, поскольку он не находится внутри строкового литерала, и вы можете использовать stmt.setString, чтобы присвоить ему значение.

6 голосов
/ 17 февраля 2012

Поскольку mu слишком короткий правильно сказал, что проблема в том, что заполнитель не распознается внутри кавычек.

В случае, если невозможно построить всю строку в Java (например, вв моем случае это было слишком навязчиво) вы можете обойти проблему, переместив заполнитель за пределы литерала, а затем используя оператор конкатенации строк PgSQL, например:

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

В вашем случае решение будет таким:1008 *

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

Не очень читабельно, но работает ...

...