Hibernate Spatial PostGis PSQLException 列是 point 类型,但 expression 是 bytea 类型
Hibernate Spatial PostGis PSQLException column is of type point but expression is of type bytea
在 Spring 引导项目中,Java8,使用 hibernate-spatial 和 PostgresDB 9.4
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>5.2.10.Final</version>
</dependency>
application.properties
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisPG94Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisPG94Dialect
(我也试过 PostgisPG9Dialect)
我的实体有一个 属性
...
import com.vividsolutions.jts.geom.Point;
....
@Column(columnDefinition = "Point")
private Point cityLocation;
如果我用空值保存没问题,但如果我输入一个值
setCityLocation(new GeometryFactory().createPoint(new Coordinate(lng, lat));
我有:
PSQLException: ERROR: column "city_location" is of type point but expression is of type bytea You will need to rewrite or cast the expression.
在我的数据库中,我可以看到列定义为
type: point
column size: 2147483647
data type: 1111
num prec radix: 10
char octet length: 2147483647
我快疯了...为什么它不起作用?
UPDATE(还是不行,正在收集新的资料)
1) 我认为问题可能出在数据库的创建上。
在我的 application.properties 我还有 :
spring.jpa.properties.hibernate.hbm2ddl.auto=update
因此架构将通过休眠更新 'automatically'。
2) 我可以 运行 直接在数据库上成功查询(我使用 "Squirrel SQL" 作为客户端)
update my_table set city_location = POINT(-13,23) where id = 1
如果我
select city_location from my_table where id = 1
答案是
<Other>
我看不到该值...我对点类型内具有空值的记录得到了相同的答案...
3) 通过查询为 'point' 列设置值后,我无法再从 table 中读取,我收到异常:
org.geolatte.geom.codec.WktDecodeException : Wrong symbol at position: 1 in Wkt: (-13.0,23.0)
4) 我查看了 hibernate-spatial-5.2.10.Final.jar 并在包 org.hibernate.spatial 中找到了两个名为 类 的 "geolatte" :
GeolatteGeometryJavaTypeDescriptor.class
GeolatteGeometryType.class
5) 还有(针对 Squirrel SQL 客户专家):
如果我尝试更改 "my_table" 中一列的值(不是 'point' city_location 而是其他列中的任何一个),我会收到类似于我在 [=83 中收到的错误=] 当我尝试插入一个点值时:
Exception seen during check on DB. Exception was:
ERROR: operator does not exist: point = character varying
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Squirrel 是用 java.. 制作的所以我可以接受这个奇怪的东西,可能它以 'wrong' 的方式组成查询,也许它与我看到的值有关做一个 select...
有什么想法吗?
我找到了解决方法!!
需要对代码进行修复,我在另一个 Whosebug 问题中读到的一个魔术救了我的命。
问题是数据库列的创建方式有误:
在数据库中,列类型应该是 geometry NOT point
我从 @Column 注释中删除了 columnDefinition = "Point" 并且我 运行 查询
CREATE EXTENSION postgis;
在我的数据库上按照这些说明操作:
Postgis installation: type "geometry" does not exist
Krishna Sapkota你是我的新超级英雄!
只需从 @Column
注释中删除 columnDefinition = "POINT"
,并仅使用 Point 对象。 (即使用默认列定义)
在 Spring 引导项目中,Java8,使用 hibernate-spatial 和 PostgresDB 9.4
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>5.2.10.Final</version>
</dependency>
application.properties
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisPG94Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisPG94Dialect
(我也试过 PostgisPG9Dialect)
我的实体有一个 属性
...
import com.vividsolutions.jts.geom.Point;
....
@Column(columnDefinition = "Point")
private Point cityLocation;
如果我用空值保存没问题,但如果我输入一个值
setCityLocation(new GeometryFactory().createPoint(new Coordinate(lng, lat));
我有:
PSQLException: ERROR: column "city_location" is of type point but expression is of type bytea You will need to rewrite or cast the expression.
在我的数据库中,我可以看到列定义为
type: point
column size: 2147483647
data type: 1111
num prec radix: 10
char octet length: 2147483647
我快疯了...为什么它不起作用?
UPDATE(还是不行,正在收集新的资料)
1) 我认为问题可能出在数据库的创建上。 在我的 application.properties 我还有 :
spring.jpa.properties.hibernate.hbm2ddl.auto=update
因此架构将通过休眠更新 'automatically'。
2) 我可以 运行 直接在数据库上成功查询(我使用 "Squirrel SQL" 作为客户端)
update my_table set city_location = POINT(-13,23) where id = 1
如果我
select city_location from my_table where id = 1
答案是
<Other>
我看不到该值...我对点类型内具有空值的记录得到了相同的答案...
3) 通过查询为 'point' 列设置值后,我无法再从 table 中读取,我收到异常:
org.geolatte.geom.codec.WktDecodeException : Wrong symbol at position: 1 in Wkt: (-13.0,23.0)
4) 我查看了 hibernate-spatial-5.2.10.Final.jar 并在包 org.hibernate.spatial 中找到了两个名为 类 的 "geolatte" :
GeolatteGeometryJavaTypeDescriptor.class GeolatteGeometryType.class
5) 还有(针对 Squirrel SQL 客户专家): 如果我尝试更改 "my_table" 中一列的值(不是 'point' city_location 而是其他列中的任何一个),我会收到类似于我在 [=83 中收到的错误=] 当我尝试插入一个点值时:
Exception seen during check on DB. Exception was:
ERROR: operator does not exist: point = character varying
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Squirrel 是用 java.. 制作的所以我可以接受这个奇怪的东西,可能它以 'wrong' 的方式组成查询,也许它与我看到的值有关做一个 select...
有什么想法吗?
我找到了解决方法!!
需要对代码进行修复,我在另一个 Whosebug 问题中读到的一个魔术救了我的命。
问题是数据库列的创建方式有误:
在数据库中,列类型应该是 geometry NOT point
我从 @Column 注释中删除了 columnDefinition = "Point" 并且我 运行 查询
CREATE EXTENSION postgis;
在我的数据库上按照这些说明操作: Postgis installation: type "geometry" does not exist
Krishna Sapkota你是我的新超级英雄!
只需从 @Column
注释中删除 columnDefinition = "POINT"
,并仅使用 Point 对象。 (即使用默认列定义)