如何根据Grails中可空连接的属性进行排序?

时间:2011-04-18 20:49:28

标签: sorting grails associations gorm

我正在尝试对数据表进行排序。我有以下域名(释义和示例):

class Car {
    Engine engine
    static constraints = {
        engine nullable: true // poor example, I know
    }
}

class Engine {
    String name
}

这是处理排序的控制器操作:

def myAction = {
    def list = Car.findAll(params)
    render(view: 'list', model: [list: list])
}

我提供了一些数据,这些数据有几个Cars,一些有空引擎,另一些有非引擎的引擎。

我尝试以下查询:

http://www.example.com/myController/myAction?sort=engine.name&order=asc

查询的结果仅返回引擎不为空的Car条目。如果我只查询关联(没有其属性),那么结果将会返回>

http://www.example.com/myController/myAction?sort=engine&order=asc

将返回所有Car结果,将具有空引擎的结果分组。

有没有办法:

  • 我可以通过关联属性获取分类的查询,以返回与仅按关联排序的结果相同的结果(将空关联组合在一起)?
  • 我可以使用传递给list()的内置排序来实现这些结果(即不使用Criteria或HQL查询)

1 个答案:

答案 0 :(得分:3)

您需要在查询中指定LEFT_JOIN,请尝试:

import org.hibernate.criterion.CriteriaSpecification

...

def list = Car.createCriteria().list ([max:params.max?:10,  offset: params.offset?:0 ]){

        if (params.sort == 'engine.name') {
            createAlias("engine","e", CriteriaSpecification.LEFT_JOIN)
            order( "e.name",params.order)

        } else {                
            order(params.sort, params.order)
        }
    }

请记住在list.gsp

中将engine.name作为要订购的属性
<g:sortableColumn property="engine.name" title="Engine Name" />