Grails:如何使用sql函数自定义订单?
我想使用Gorm检索10个最近的地理定位对象。 为此,我想自定义order()参数,以便使用get_distance(longitude,latitude,:longitude,:latitude)sql函数。 我一整天都在为这件事挣扎,有人有什么暗示吗 谢谢 编辑 我最终成功地做了我想做的事情,但有一个非常丑陋的解决方案:Grails:如何使用sql函数自定义订单?,grails,gorm,distance,Grails,Gorm,Distance,我想使用Gorm检索10个最近的地理定位对象。 为此,我想自定义order()参数,以便使用get_distance(longitude,latitude,:longitude,:latitude)sql函数。 我一整天都在为这件事挣扎,有人有什么暗示吗 谢谢 编辑 我最终成功地做了我想做的事情,但有一个非常丑陋的解决方案: 我添加了一个sqlProjection,在其中我放置了get_distance()函数,并能够按它排序 添加投影会删除对对象属性的检索,因此我必须通过添加属性投影明确地请
- 我添加了一个sqlProjection,在其中我放置了get_distance()函数,并能够按它排序
- 添加投影会删除对对象属性的检索,因此我必须通过添加属性投影明确地请求它,并且我通过内省成功地做到了这一点李>
- 然后,我必须为它定义标准的结果转换器,以便为我提供域实例
import org.hibernate.dialect.function.SQLFunctionTemplate
import org.hibernate.Hibernate
def dialect = applicationContext.sessionFactory.dialect
def getDistance = new SQLFunctionTemplate(Hibernate.INTEGER, "get_distance(?1,?2)")
dialect.registerFunction('get_distance', getDistance)
然后您可以在HQL中使用它:
Location.executeQuery(
"""
select id, get_distance(latitude, longitude) as distance
from Location
order by distance
""",
[], [max: 10])
我们所做的是:
谢谢你的快速回答!问题是我需要在createCriteria()查询中具有相同的行为。有什么想法吗?我想你可以使用
sqlRestriction
在条件中使用函数进行过滤,但我不知道如何使用它进行排序。很好的技巧,但我认为它不适用于我的情况:我的get_distance()函数需要参数,因为它计算到给定坐标的距离:按获取距离(l.经度,l.纬度,:经度,:纬度)的顺序从位置l选择*确定。。我已经十多年没有使用数据库中的存储过程/函数了,除了第一个解决方法之外,我看不到任何其他方法。。您可以尝试从较低级别的休眠角度进行操作。。