数据截断:无法从发送到 GEOMETRY 字段的数据中获取几何对象

Data truncation: Cannot get geometry object from data you send to the GEOMETRY field

提问人:GyeongEun Kim 提问时间:6/23/2023 最后编辑:GyeongEun Kim 更新时间:6/23/2023 访问量:119

问:

嗨,我正在尝试将geo data(POINT)插入并读取mySQL DB。

我正在使用 JPA

我从前端获得了纬度和经度,并制作了一个像 POINT(10, 20) 这样的字符串作为 wkt。

然后通过使用 WKTReader,我制作了一个 Point 对象,制作了一个实体,并调用了 jpa save 方法。

但是我弄错了。 Data truncation: Cannot get geometry object from data you send to the GEOMETRY field

我的代码有什么问题?

顺便说一句,我用过

org.locationtech.jts.geom.Point;

+) 当我尝试将点插入为 WKT(Stirng) 时,它可以工作。(它与 BLOB 一起存储在 DB 中) 我应该这样做吗????

服务

  @Transactional
    public void addClub (AddClubRequest clubRequest) throws ParseException {
        Member master = memberRepository.getReferenceById(clubRequest.getUserId());
  
        Point point = makePoint(clubRequest.getLatitude(), clubRequest.getLongitude());
    
        Club club = clubRequest.toClub(master, point);

        clubRepository.save(club);

    }

public Point makePoint (Float latitude, Float longitude) throws ParseException {
         String wkt = String.format("POINT(%s %s)", latitude, longitude);
         return (Point)new WKTReader().read(wkt);
    }

实体

 @Column(name = "club_point", columnDefinition = "POINT")
    private Point clubPoint;

YML系列

spring  
 jpa :
    properties:
      hibernate:
        database-platform: org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect

build.gradle

implementation 'org.hibernate:hibernate-core:5.6.3.Final'
    implementation group: 'org.locationtech.jts', name: 'jts-core', version: '1.16.1'
    implementation group: 'org.hibernate', name: 'hibernate-spatial', version: '5.6.15.Final'
java spring jpa 休眠空间

评论


答:

0赞 James 6/23/2023 #1

这里的目标是能够在遇到“数据截断”之前保存。

您的错误似乎表明发送的数据不正确。 我认为我们可以尝试使用MySQL函数保存数据的不同方法:

ST_PointFromText

为了直接保存数据。

这就是我修改你的代码的方式,从makePoint开始:

public String makePoint(Float latitude, Float longitude) {
    return String.format("POINT(%s %s)", latitude, longitude);
}

现在在你的addClub中:我会把它修改为:
clubRepository.save(club);

clubRepository.saveWithPoint(club, makePoint(clubRequest.getLatitude(), clubRequest.getLongitude()));

我们创建了一个新方法:

@Transactional
@Modifying
@Query(value = "INSERT INTO club (club_name, club_point) VALUES (:clubName, ST_PointFromText(:point))", nativeQuery = true)
void saveWithPoint(@Param("clubName") String clubName, @Param("point") String point);

不要忘记导入您需要的所有内容。