【问题标题】:Error when inserting through JDBC通过 JDBC 插入时出错
【发布时间】:2013-08-30 18:14:07
【问题描述】:

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

【问题讨论】:

  • 省略'POINT(33.206201 -87.525480)' 周围的单引号。这是一个函数调用,而不是字符串文字
  • @a_horse_with_no_name,这实际上不适用于 Postgres JDBC 驱动程序。 statement.setString(1,"POINT(1 2)"); 导致投诉 ERROR: column "geography" is of type geography but expression is of type character...
  • 你的SQL语句没有使用参数,这就是我写的原因。对于 PreparedStatement,您需要 SQL 字符串中的 point(?,?)不带单引号)和 两个 setFloat() 调用来为每个 ? 提供值
  • ireeder,应该是“POINT”(1,2),而不是“POINT(1 2)”,因为它们是完全不同的东西。

标签: java jdbc gis postgis jdbc-postgres


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多