如何将Polygon映射到PostGIS的GEOMETRY(POLYGON,4326)类型?
问题分析
你现在的核心问题是误用了Spring Data的org.springframework.data.geo.Polygon——这个类型是Spring Data封装来做地理查询的,不能直接映射数据库的几何字段。得换成Hibernate Spatial支持的JTS原生几何类型来解决。
解决步骤
1. 引入必要依赖
如果用Maven,添加Hibernate Spatial和JTS核心库的依赖(根据你的Hibernate版本调整版本号):
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-spatial</artifactId> <version>你的Hibernate对应版本</version> </dependency> <dependency> <groupId>org.locationtech.jts</groupId> <artifactId>jts-core</artifactId> <version>1.19.0</version> </dependency>
2. 修改实体类代码
把Spring Data的Polygon替换为JTS的org.locationtech.jts.geom.Polygon,并正确配置注解:
package br.com.api.model; import jakarta.validation.Valid; import lombok.Data; import org.locationtech.jts.geom.Polygon; import javax.persistence.*; import org.hibernate.annotations.Type; @Data @Entity @Table(name = "block") public class Block { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "block_id") private Integer id; @Column @Valid private Integer numero; @Column(columnDefinition = "GEOMETRY(POLYGON, 4326)") @Type(type = "org.hibernate.spatial.GeometryType") private Polygon poligono; }
3. 配置Hibernate方言
在application.properties(或yml)里指定支持PostGIS的方言:
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
如果用的是PostgreSQL 10+版本,可以用更匹配的方言,比如org.hibernate.spatial.dialect.postgis.PostgisPG10Dialect。
关键注意点
- Spring Data的
org.springframework.data.geo.Polygon只用于Repository层的查询参数/返回结果,不能直接作为实体字段映射数据库。 - 之前@Type注解无效,大概率是没引入Hibernate Spatial依赖,或者注解指定的类型不对。
- 确保你的PostgreSQL数据库已经安装了PostGIS扩展,否则数据库无法识别
GEOMETRY类型字段。
内容的提问来源于stack exchange,提问作者João Staub
相关产品推荐
相关产品推荐

