使用Hibernate和PostGIS在同一查询中获取距离和域属性

时间:2014-03-01 00:35:20

标签: hibernate grails postgis hibernate-spatial

我正在使用Hibernate,Postgre,PostGIS和Grails。

要搜索给定半径范围内的所有用户,我使用的是HibernnateSpetial,一切正常。

def criteria = sessionFactory.currentSession.createCriteria(User)
criteria.createAlias('location', 'location')
criteria.add(SpatialRestrictions.within("location.point", boundingPolygon))
criteria.list()

现在,我还希望所有用户在相同的标准执行中与给定点的距离。

def criteria = sessionFactory.currentSession.createCriteria(User)
criteria.createAlias('location', 'location')
criteria.add(SpatialRestrictions.within("location.point", boundingPolygon))
String[] columnAlias = new String[1]
columnAlias[0] = "distance"
org.hibernate.type.Type[] types = new StandardBasicTypes[1]
types[0] = StandardBasicTypes.DOUBLE
criteria.setProjection(Projections.sqlProjection("ST_Distance(point, ST_GeomFromText('POINT(-84.3346473 33.9462125)', 4326)) as distance", columnAlias, types))
criteria.list()

它返回存储在数据库中的Geometry(点)与SQL中提供的点之间的距离,但忽略User域的属性。在执行标准后我得到了这样的东西 - [0.0,0.20430178027717,0.0]。

我想知道我是否可以从给定的lat / lng获得每个用户的所有用户+距离。我可以使用Groovy / Java代码来计算结果的距离,但我需要从标准执行中排序的结果,以便我也可以应用分页。

1 个答案:

答案 0 :(得分:0)

如果你想来获得距离,那么直接在你的groovy代码中计算它似乎更容易,例如:

giveMeAllHitsFromGIS().each{
  it.distance = it.point1.distanceTo( it.point2 )
}

您的代码已经因低级别的hibernate / space内容而有点过载,如果您增加空间查询的复杂性,它的可读性会降低