我有一个这样的假设:

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 Data JPA没有识别PostGIS功能。此聚合函数(SQL的总和)工作正常:
@Query("select sum(p.id) from Pipe p where p.id in ?1")
Number getPipesSum(Collection<Number> ids);

最佳答案

也许,因为st_extent函数返回box2d数据类型。
查询的结果是
“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
希望能行

关于java - 在JpaRepository的查询中执行PostGIS功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40487881/

10-13 05:37