2016-11-08 50 views
0

我有这样一个JpaRepository:执行PostGIS的功能

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); 
+0

检查[Hibernate Spatial](http://www.hibernatespatial.org/)。 – lexicore

回答

0

也许,因为st_extent funtion返回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

我希望它的工作原理

+0

我需要'st_extent'因为它是一个聚合函数。在我真正的用例中,查询是'WHERE p.id IN?1'作为ID列表的参数,我想要所有涉及的几何的范围。我编辑我的问题。 –

+0

我编辑第二个查询,用geomfromtext,你有几何图形,然后你可以解析 – gaston

+0

同样的例外(其中还提到了两个postgis函数)。投射选项不起作用('意外标记::靠近第1行,第29列)。 –