Sorting 如何在Grails中按可空关联的属性排序?

Sorting 如何在Grails中按可空关联的属性排序?,sorting,grails,associations,gorm,Sorting,Grails,Associations,Gorm,我正在尝试对数据表进行排序。我有以下领域(解释并举例说明): 以下是处理排序的控制器操作: def myAction = { def list = Car.findAll(params) render(view: 'list', model: [list: list]) } 我提供了一些数据,以便有几辆车,一些车的发动机为空,另一些车的发动机为非空 我尝试以下查询: http://www.example.com/myController/myAction?sort=engine

我正在尝试对数据表进行排序。我有以下领域(解释并举例说明):

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

def myAction = {
    def list = Car.findAll(params)
    render(view: 'list', model: [list: list])
}
我提供了一些数据,以便有几辆车,一些车的发动机为空,另一些车的发动机为非空

我尝试以下查询:

http://www.example.com/myController/myAction?sort=engine.name&order=asc
查询结果仅返回引擎不为null的Car条目。这与仅查询关联(不查询其属性)时返回的结果不同:

它将返回所有的Car结果,将带有空引擎的结果分组在一起

有没有办法:

  • 我可以得到按关联属性排序的查询,以返回与仅按关联排序的查询相同的结果(将空关联分组在一起)
  • 我可以使用传递到
    list()
    的内置排序来实现这些结果(即,不使用条件或HQL查询)

您需要在查询中指定LEFT\u 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)
        }
    }
请记住将engine.name作为要在list.gsp中订购的属性

<g:sortableColumn property="engine.name" title="Engine Name" />

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)
        }
    }
<g:sortableColumn property="engine.name" title="Engine Name" />