提问人:GyeongEun Kim 提问时间:6/23/2023 最后编辑:GyeongEun Kim 更新时间:6/23/2023 访问量:119
数据截断:无法从发送到 GEOMETRY 字段的数据中获取几何对象
Data truncation: Cannot get geometry object from data you send to the GEOMETRY field
问:
嗨,我正在尝试将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'
答:
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);
不要忘记导入您需要的所有内容。
评论