Grails:如何使用sql函数自定义订单?

Grails:如何使用sql函数自定义订单?,grails,gorm,distance,Grails,Gorm,Distance,我想使用Gorm检索10个最近的地理定位对象。 为此,我想自定义order()参数,以便使用get_distance(longitude,latitude,:longitude,:latitude)sql函数。 我一整天都在为这件事挣扎,有人有什么暗示吗 谢谢 编辑 我最终成功地做了我想做的事情,但有一个非常丑陋的解决方案: 我添加了一个sqlProjection,在其中我放置了get_distance()函数,并能够按它排序 添加投影会删除对对象属性的检索,因此我必须通过添加属性投影明确地请

我想使用Gorm检索10个最近的地理定位对象。 为此,我想自定义order()参数,以便使用get_distance(longitude,latitude,:longitude,:latitude)sql函数。 我一整天都在为这件事挣扎,有人有什么暗示吗

谢谢

编辑

我最终成功地做了我想做的事情,但有一个非常丑陋的解决方案:

  • 我添加了一个sqlProjection,在其中我放置了get_distance()函数,并能够按它排序
  • 添加投影会删除对对象属性的检索,因此我必须通过添加属性投影明确地请求它,并且我通过内省成功地做到了这一点
  • 然后,我必须为它定义标准的结果转换器,以便为我提供域实例

如果使用hibernate SQL方言注册函数,则可以在HQL查询中使用它。例如,将其放入引导代码中:

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])

我们所做的是:

  • 使用特定于DB的运算符创建查询,但作为视图
  • 创建一个新的域类对象来单独映射到视图,从而允许您执行GORM标准查询等

  • 谢谢你的快速回答!问题是我需要在createCriteria()查询中具有相同的行为。有什么想法吗?我想你可以使用
    sqlRestriction
    在条件中使用函数进行过滤,但我不知道如何使用它进行排序。很好的技巧,但我认为它不适用于我的情况:我的get_distance()函数需要参数,因为它计算到给定坐标的距离:按获取距离(l.经度,l.纬度,:经度,:纬度)的顺序从位置l选择*确定。。我已经十多年没有使用数据库中的存储过程/函数了,除了第一个解决方法之外,我看不到任何其他方法。。您可以尝试从较低级别的休眠角度进行操作。。