背景
在做单车项目的时候,有一个功能点是展示周围的车辆。其实这个功能在之前的项目中也用到过,只不过一直都是用的mongoDB来实现的,后来在看文档的时候发现了,mysql也支持就想尝试使用下,在使用的过程中,出现了许多障碍,特此记录下。
一、 首先创建表,索引。
CREATE TABLE location(
address CHAR(80) NOT NULL,
address_loc POINT NOT NULL,
PRIMARY KEY(address)
);
ALTER TABLE address ADD SPATIAL INDEX(address_loc);
二、 使用springboot创建数据层
1. 创建entity
@Entity
@Table(name = "location")
public class LocationEntity implements java.io.Serializable {
/** */
@Column(name = "address", unique = true, nullable = false, length = 80)
private String address;
/** 此处Point(纬度,经度) */
@Column(name = "address_loc",columnDefinition = "POINT")
private Point addressLoc;
}
2. jpa
public interface LocationDao extends JpaRepository<LocationEntity , Integer>{}
三、service处理
@Override
public Result pushRedPackage(LocationEntity entity) {
//TODO 处理一些业务判断
……
WKTReader reader = new WKTReader();
Geometry geom = null;
try {
geom = reader.read("POINT(" + entity.getLat() + " " + entity.getLon() + ")");
} catch (ParseException e) {
e.printStackTrace();
}
entity.setAddress((com.vividsolutions.jts.geom.Point) geom);
redDao.save(entity);
return Result.ok();
}
关键点留在最后,这样还不足以能插入数据,会提示异常。Cannot get geometry object from data you send to the GEOMETRY field
需要在配置文件jpa加入支持。我使用的yml文件。
jpa:
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate.format_sql: true
hibernate.dialect: org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect