当我通过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种修复方法:
-
在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"
@Tim-感谢您对类似问题的帮助-我不得不将ST_GeometryFromText写入数据库,JDBC驱动程序抛出了与@Hanks类似的异常。
为了进一步参考和澄清其他人——这是我使用Java和JDBC的结果:
INSERT INTO streets.points ( point_id, the_geom )
VALUES( ?, ST_GeomFromText( ? , 25832) );
插入的几何字符串看起来是这样的:
POINT(33.206201 -87.525480)