1

当我通过它运行下面的 sql 语句psql时,它工作正常,但是当我尝试通过使用 a 构建它来运行相同的查询时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)

4

2 回答 2

1

我知道这是一个老问题,但我大部分时间都在调试相同的基本问题,终于找到了解决办法

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

正如您发现的那样,如果您将 WKT 包含在 SQL 的主体中,那么它会起作用,但如果您在准备好的语句上使用参数,则会失败。

修复它有 3 个选项:

  1. 在您的 SQL 中使用 st_GeographyFromText,如下所示:

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

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

  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"
    
于 2014-10-16T02:59:52.697 回答
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)
于 2015-03-25T14:40:09.963 回答