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

标签 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]。

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

最佳答案

如果您只想来回溯距离,似乎可以直接在常规代码中计算出距离,例如:

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

您的代码已经有点低级的休眠/空间内容,如果您增加空间查询的复杂性,它的可读性就会降低

关于hibernate - 使用Hibernate和PostGIS在同一查询中获取距离和域属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22108449/

相关文章:

java - 尝试在tomcat 9中加载maven项目,显示启动时子容器失败

grails - 将 GroovyRowResult 列表索引到 Map 中

java - grails 2.5.2 run-app 可以运行但不能运行

postgresql - 如何在 docker 中为 postgresql 创建 postgis 扩展?

ruby-on-rails - st_split 返回原始行

postgresql - Postgis - 一个圆圈包含另一个

hibernate - Grails Hibernate GORM,具有一对一关系的 Multi-Tenancy

java - 通过 JPQL UPDATE 查询获取更新的实体

spring - 如何使用 Spring 缓存缓存 JPA OneToMany 关系

java - Grails WAR 无法在 java 类中找到文件