当前位置: 首页 > 知识库问答 >
问题:

Hibernate Spatial PostGis PSQLException列的类型为point,但表达式的类型为bytea

司空镜
2023-03-14

在Spring Boot的一个项目中,Java8使用hibernate-spatial和PostgresDB 9.4

    <dependency> 
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-spatial</artifactId>
        <version>5.2.10.Final</version>
    </dependency>

应用程序属性

spring.datasource.driver-class-name=org.postgrehtml" target="_blank">sql.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

我要疯了...为什么它不起作用?

更新(仍然不起作用,我正在收集新信息)

1)我认为问题可能是数据库的创建。在我的application.properties我也有:

spring.jpa.properties.hibernate.hbm2ddl.auto=update

因此,模式将通过hibernate“自动”更新。

2)我可以直接在数据库上成功运行查询(我使用“松鼠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”列后,我无法再从表中读取,我收到异常:

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.classGeolatteGeometryType.class

5)而且(具体为SquirrelSQL客户端专家):如果我试图改变一个列的值在my_table(不是点city_location但任何其他列)我re0019一个类似的错误,我在java当我试图插入一个点值re0019:

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制作的..所以我可以接受这个奇怪的东西,可能是它以一种“错误”的方式组成了查询,也许它连接到了我在选择时看到的值。。。

有什么想法吗?

共有2个答案

杜辰龙
2023-03-14

只需从@Colzo注释中删除列定义="POINT",然后只需使用Point对象。(即使用默认列定义)

戈睿识
2023-03-14

我找到了解决办法!!

需要对代码进行修复,我在另一个堆栈溢出问题中读到的魔术挽救了我的生命。

问题是db列的创建方式错误:

在数据库中,列类型应为几何图形,而不是点

我从@Column注释中删除了columnDefinition = "Point ",并运行了查询

CREATE EXTENSION postgis;

在我的数据库上,遵循以下说明:Postgis安装:类型“几何”不存在

Krishna Sapkota你是我新的超级英雄!

 类似资料:
  • 我正在尝试使用nifi将CSV记录插入Postgres数据库。 示例csv文件: 当nifi场景运行时,它会给出以下错误 错误列“timenow”的类型为timestamp,没有时区,但表达式的类型为character variating 如果我使用正常的 没有错误值插入到表中。我必须更改nifi配置才能将其添加到表中吗? 我换了Nifi CSVReader- 编辑:在第一条注释之后,Nifi生成

  • 我需要使用SpringDataJPA将实体类的两列映射为postgres中的json。阅读多个stackoverflow post和baeldung post后, 如何使用JPA将MapJSON列映射到Java对象 https://www.baeldung.com/hibernate-persist-json-object 我做了如下配置。但是,我面临错误"ERROR:列"标题"是json类型,但

  • 这是我的实体类,映射到(9.4)中的一个表。我正在尝试将元数据存储为数据库中的类型 这是元数据类: 我使用以下迁移文件添加了列: 在中创建记录时出现此错误:错误:列“metadata”的类型为,但表达式的类型为提示:您需要重写或强制转换表达式。 这是我试图在db中持久化的请求主体: 请帮助如何转换类型为在javaSpring启动应用程序

  • 我是爪哇的新手。我不明白为什么会发生这些错误。尝试创建一个数组列表,以便它保存每个对象。我得到的错误是 表达式的类型必须是数组类型,但它解析为数组列表上的行“newbug1[i].setpecies();” 提前致谢

  • 在我将PostgreSQL 13个数据库列标记更改为jsonb后,执行sql时抛出错误: 在使用mybatis时,我应该如何处理spring boot应用程序中的jsonb?

  • 问题内容: 在不同数据库之间进行切换时,关于包含大对象(BLOB)的hibernate映射,我有一个奇怪的问题。 上面的字段在MySQL和Oracle中创建一个字节数组字段,但是在PostreSQL中,它创建一个oid类型的字段。 现在,当我尝试访问该字段时,它在其他数据库中也能正常工作,但是在PostgreSQL中,它失败并显示以下错误 因此,我试图简单地删除“ @Lob”注释,这将解决Post