通过JDBC插入时出错



当我通过psql运行下面的sql语句时,它运行得很好,但当我试图通过用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)

我知道这是一个老问题,但我只是花了一天的大部分时间调试同一个基本问题,最终找到了解决方案

您要做的是使用WKT提供POINT,并让服务器自动将其转换为Geometry

正如您所发现的,如果您将WKT包含在SQL的主体中,这是有效的,但如果您在准备好的语句中使用参数,则会失败。

有3种修复方法:

  1. 在SQL中使用st_GeographyFromText,如:

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

    然后使用setString将参数设置为WKT
    根据所涉及的框架,这对您来说可能是不可能的。

  2. 对preparedStatement使用setObject,而不是setString。例如:

    ps.setObject(1, "POINT(33.206201 -87.525480)", java.sql.Types.OTHER )
    
  3. 更改JDBC驱动程序设置,以unspecified类型发送字符串,然后服务器将为您进行类型转换。要做到这一点,您需要将JDBC URL更改为类似的内容

    "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)

最新更新