通过JDBC插入时出错

时间:2013-08-30 18:14:08

标签: java jdbc gis postgis jdbc-postgres

当我通过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)

2 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但我只是花了大部分时间调试相同的基本问题,最后找到了修复

您尝试做的是使用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"
    

答案 1 :(得分:0)

@Tim - 感谢您对类似问题的帮助 - 我不得不将ST_GeometryFromText编写到我的数据库中,并且JDBC驱动程序抛出了与@Hanks相似的异常。

有关其他人的进一步参考和说明 - 这是我使用Java和JDBC的结果:

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

插入的Geometry-String看起来像这样:

POINT(33.206201 -87.525480)