2

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

谢谢 !

编辑

我终于设法做我想做的事,但解决方案非常难看:

  • 我添加了一个 sqlProjection,我在其中放置了我的 get_distance() 函数并能够通过它进行排序。
  • 添加投影会删除对象属性的检索,因此我必须通过添加属性投影来明确要求它,并且我设法通过自省来做到这一点。
  • 然后我必须为它定义标准的结果转换器来给我域实例。
4

2 回答 2

1

如果使用休眠 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])
于 2012-04-16T16:29:03.863 回答
0

我们所做的如下:

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