我有一个像这样的JpaRepository:
public interface PipeRepository extends JpaRepository<Pipe, Long> {
@Query("select p from Pipe p where st_intersects(p.geometry, ?1)=true")
Collection<Pipe> find(Geometry envelope);
@Query(value = "SELECT st_extent(p.geometry) FROM Pipe p WHERE p.id IN ?1")
Geometry getPipe(Collection<Number> id);
}
第一个运行正常,但第二个在初始化期间抛出此异常:
org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode
\-[METHOD_CALL] MethodNode: '('
+-[METHOD_NAME] IdentNode: 'st_extent' {originalText=st_extent}
\-[EXPR_LIST] SqlNode: 'exprList'
\-[DOT] DotNode: 'pipe0_.geometry' {propertyName=geometry,dereferenceType=PRIMITIVE,getPropertyPath=geometry,path=p.geometry,tableAlias=pipe0_,className=es.x.model.Pipe,classAlias=p}
+-[ALIAS_REF] IdentNode: 'pipe0_.id' {alias=p, className=es.x.model.Pipe, tableAlias=pipe0_}
\-[IDENT] IdentNode: 'geometry' {originalText=geometry}
st_intersects
工作的原因和st_extent
不工作的原因有什么线索吗?
更新:我认为问题在于Spring不承认PostGIS函数。这个聚合函数(SQL的sum)正确工作:
@Query("select sum(p.id) from Pipe p where p.id in ?1")
Number getPipesSum(Collection<Number> ids);
发布于 2020-03-04 08:07:43
我有一个类似的问题,并解决了以下问题:
在接口中,可以使用st_astext()作为WKT接收查询结果。
@Query(value = "SELECT st_astext(st_extent(p.geometry)) FROM Pipe p WHERE p.id IN ?1")
String getPipe(Collection<Number> id);
您将看到返回类型是一个字符串(可能是好的,也可能不是好的)。
一旦您从数据库中取回您的WKT,我就使用org.locationtech.jts.geom.GeometryFactory将其转换回几何。
@Autowired
private GeometryFactory factory;
WKTReader reader = new WKTReader(factory);
Geometry geom = reader.read(yourReturnVariable);
如果您查看geom.getGeometryType()
,您将看到它是一个可行的几何学,然后您可以在其他操作中使用。
正如我之前说过的,这可能不是一个好的解决方案,但它确实有效。
发布于 2016-11-08 05:47:22
可能是因为st_extent函数返回box2d
dataType。
查询的结果是
"BOX(x1 y1,x2 y2)",但您可以转换为几何学
SELECT st_extent(p.geometry)::geometry FROM Pipe p WHERE p.id = ?1
或者(为了避免使用:)
SELECT st_geometryFromText(st_astext(st_extent(p.geometry))),<your SRID>) FROM Pipe p WHERE p.id = ?1
我希望它能用
https://stackoverflow.com/questions/40487881
复制相似问题