You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:59:54