当我通过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)
答案 0 :(得分:0)
我知道这是一个老问题,但我只是花了大部分时间调试相同的基本问题,最后找到了修复
您尝试做的是使用WKT提供POINT
并让服务器自动将其转换为Geometry
。
正如您发现,如果将WKT包含在SQL正文中,则可以正常工作,但如果在预准备语句中使用参数则会失败。
有3种方法可以解决它:
在SQL中使用st_GeographyFromText,如下所示:
INSERT INTO Hvbp(coordinates) VALUES( st_GeographyFromText(?) )
然后使用setString
将参数设置为WKT
根据所涉及的框架,您可能无法做到这一点。
在preparedStatement而不是setObject
上使用setString
。例如:
ps.setObject(1, "POINT(33.206201 -87.525480)", java.sql.Types.OTHER )
更改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)