Ошибка при вставке через JDBC

Когда я запускаю SQL-оператор ниже через psql он работает нормально, но когда я пытаюсь выполнить тот же запрос, построив его с preparedstatement, это не удается.

INSERT INTO Hvbp 
  (provider_number, weighted_clinical_process, 
   weighted_patience_experience, total_performance_score, 
   coordinates, latitude, longitude, address, city, state, zip) 
VALUES 
('010092', 43.909090909091, 13.5, 57.409090909091, 
 'POINT(33.206201 -87.525480)', 33.206200613000476, 
 -87.52548020899968, '809 UNIVERSITY BOULEVARD EAST', 'TUSCALOOSA', 'AL', '');

Ошибка, которую я продолжаю получать,

org.postgresql.util.PSQLException: ERROR: column "coordinates" is of type geography but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 203

coordinates столбец имеет тип GEOGRAPHY(POINT)

2 ответа

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

То, что вы пытаетесь сделать, это предоставить POINT используя WKT, и сервер автоматически преобразует это в Geometry,

И, как вы обнаружили, это работает, если вы включаете WKT в тело SQL, но не работает, если вы используете параметр в подготовленном операторе.

Есть 3 варианта исправления:

  1. Используйте st_GeographyFromText в вашем SQL следующим образом:

    INSERT INTO Hvbp(coordinates) VALUES( st_GeographyFromText(?) ) 
    

    И затем установите ваши параметры как WKT с setString,
    В зависимости от задействованных структур, это может оказаться невозможным для вас.

  2. использование setObject на подготовленное государство вместо setString, Например:

    ps.setObject(1, "POINT(33.206201 -87.525480)", java.sql.Types.OTHER )
    
  3. Измените настройки драйвера JDBC для отправки строк как unspecified тип, а затем сервер сделает преобразования типов для вас. Для этого вы хотите изменить свой URL JDBC на что-то вроде

    "jdbc:postgresql:my_db?stringtype=unspecified"
    

@Tim - спасибо за вашу помощь с подобной проблемой - мне пришлось написать ST_GeometryFromText в мою базу данных, и драйвер JDBC выдал аналогичное исключение, как @Hanks.

Для дальнейшего ознакомления и уточнения для других - это мой результат использования Java с JDBC:

INSERT INTO streets.points ( point_id, the_geom ) 
        VALUES( ?, ST_GeomFromText( ? , 25832)  );

И вставленная строка геометрии выглядела так:

POINT(33.206201 -87.525480)
Другие вопросы по тегам