2016-11-08 99 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列)。 –