Grails:如何使用sql函数自定义顺序?

时间:2012-04-16 15:14:52

标签: grails gorm distance

我想使用Gorm检索10个最近的地理定位对象。 为此,我想自定义 order()参数,以便使用 get_distance(经度,纬度,:经度,:纬度) sql函数。 我一整天都在苦苦挣扎,有人有提示吗?

谢谢!

修改

我终于设法做了我想要的事情,但是有一个非常丑陋的解决方案:

  • 我添加了一个sqlProjection,我在其中放入了我的get_distance()函数,并且可以通过它进行排序。
  • 添加投影会删除对象属性的检索,因此我必须通过添加属性投影明确地要求它,我设法通过内省来实现。
  • 然后我必须为其定义标准的结果转换器,以便为我提供域实例。

2 个答案:

答案 0 :(得分:1)

如果使用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])

答案 1 :(得分:0)

我们做了以下事情:

  1. 使用任何特定于数据库的运算符创建查询,但作为视图
  2. 创建一个新的域类对象,仅用于映射到视图,从而允许您执行GORM条件查询等。