无法使用 spring 和休眠 5.0 执行空间查询
Can't execute spatial query with spring and hibernate 5.0
这是我的模型
package objects;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import javax.persistence.*;
/**
* Created by michael on 29/10/15.
*/
@Entity
public class Location {
public Geometry getShape() {
return shape;
}
public void setShape(Geometry shape) {
this.shape = shape;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Geometry shape;
public Location() {
}
@Override
public String toString() {
return "Location{" +
"id=" + id +
", shape=" + shape +
'}';
}
}
这是我的控制器
@RestController
public class ObjectController {
@Bean
public Module jtsModule() {
return new JtsModule();
}
@Autowired
private LocationRepository repository;
@RequestMapping(name = "/shape", method = RequestMethod.POST)
public Collection<Location> createObjects() throws JsonProcessingException, ParseException {
WKTReader wktReader = new WKTReader();
Geometry geom = wktReader.read("POINT(-105 -105)");
Geometry filter = wktReader.read("POLYGON((-107 39, -102 41, -107 41, -107 39))");
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JtsModule());
Location location = new Location();
GeometryFactory factory = new GeometryFactory();
GeometricShapeFactory f = new GeometricShapeFactory(factory);
location.setShape(geom);
repository.save(location);
f.setCentre(new Coordinate(50, 50));
f.setSize(100);
Polygon circle = f.createCircle();
return repository.findWithin(filter);
}
}
这是我的存储库
@Repository
public interface LocationRepository extends CrudRepository<Location, Long> {
@Query("select l from Location l where within(l.shape, ?) = true")
List<Location> findWithin(Geometry geometry);
}
这是我的配置
spring:
profiles: production
datasource:
platform: postgres
url: jdbc:postgresql://192.168.99.100:5432/db
username: user
password: password
database:
driverClassName: org.postgresql.Driver
jpa:
database: POSTGRESQL
platform: postgres
show-sql: true
ddl-auto: update
hibernate:
spatial:
dialect:
postgis: PostgisDialect
---
spring:
profiles: development
datasource:
platform: h2
url: jdbc:h2:mem:test
jpa:
hibernate:
show-sql: true
spatial:
dialect:
h2geodb: GeoDBDialect
我正在使用 postgis,如果我删除查询并只保存几何图形,它会工作正常。所以我想空间支持真的很有效。
好的,问题出在配置上。
正确的配置应该是这样的
jpa:
database: POSTGRESQL
database-platform: org.hibernate.spatial.dialect.postgis.PostgisDialect
show-sql: true
hibernate:
ddl-auto: update
这是我的模型
package objects;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import javax.persistence.*;
/**
* Created by michael on 29/10/15.
*/
@Entity
public class Location {
public Geometry getShape() {
return shape;
}
public void setShape(Geometry shape) {
this.shape = shape;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Geometry shape;
public Location() {
}
@Override
public String toString() {
return "Location{" +
"id=" + id +
", shape=" + shape +
'}';
}
}
这是我的控制器
@RestController
public class ObjectController {
@Bean
public Module jtsModule() {
return new JtsModule();
}
@Autowired
private LocationRepository repository;
@RequestMapping(name = "/shape", method = RequestMethod.POST)
public Collection<Location> createObjects() throws JsonProcessingException, ParseException {
WKTReader wktReader = new WKTReader();
Geometry geom = wktReader.read("POINT(-105 -105)");
Geometry filter = wktReader.read("POLYGON((-107 39, -102 41, -107 41, -107 39))");
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JtsModule());
Location location = new Location();
GeometryFactory factory = new GeometryFactory();
GeometricShapeFactory f = new GeometricShapeFactory(factory);
location.setShape(geom);
repository.save(location);
f.setCentre(new Coordinate(50, 50));
f.setSize(100);
Polygon circle = f.createCircle();
return repository.findWithin(filter);
}
}
这是我的存储库
@Repository
public interface LocationRepository extends CrudRepository<Location, Long> {
@Query("select l from Location l where within(l.shape, ?) = true")
List<Location> findWithin(Geometry geometry);
}
这是我的配置
spring:
profiles: production
datasource:
platform: postgres
url: jdbc:postgresql://192.168.99.100:5432/db
username: user
password: password
database:
driverClassName: org.postgresql.Driver
jpa:
database: POSTGRESQL
platform: postgres
show-sql: true
ddl-auto: update
hibernate:
spatial:
dialect:
postgis: PostgisDialect
---
spring:
profiles: development
datasource:
platform: h2
url: jdbc:h2:mem:test
jpa:
hibernate:
show-sql: true
spatial:
dialect:
h2geodb: GeoDBDialect
我正在使用 postgis,如果我删除查询并只保存几何图形,它会工作正常。所以我想空间支持真的很有效。
好的,问题出在配置上。
正确的配置应该是这样的
jpa:
database: POSTGRESQL
database-platform: org.hibernate.spatial.dialect.postgis.PostgisDialect
show-sql: true
hibernate:
ddl-auto: update