如何在Grails中按多个字段排序?

如何在Grails中按多个字段排序?,grails,sql-order-by,gorm,Grails,Sql Order By,Gorm,有没有办法得到一个按两个字段排序的列表,比如姓和名 我知道.listOrderByStandFirst和.list(排序:'last,first')不起作用。如果要对列表中的项目内容进行排序,则需要实现一个比较器,该比较器具有一些智能功能,可以根据多个属性决定排序顺序 下面给出了Groovy风格比较器的一些示例 但是,如果您正在排序的列表是从数据库查询返回的,则最好使用CrteriaQuery对其进行排序,并在该列表上进行排序。此旧解决方案不再有效。请参见下面mattlary的回答 您可能需要在

有没有办法得到一个按两个字段排序的列表,比如姓和名


我知道
.listOrderByStandFirst
.list(排序:'last,first')
不起作用。

如果要对列表中的项目内容进行排序,则需要实现一个比较器,该比较器具有一些智能功能,可以根据多个属性决定排序顺序

下面给出了Groovy风格比较器的一些示例


但是,如果您正在排序的列表是从数据库查询返回的,则最好使用CrteriaQuery对其进行排序,并在该列表上进行排序。此旧解决方案不再有效。请参见下面mattlary的回答

您可能需要在HQL中编写一个自定义查找程序或使用Criteria Builder

MyDomain.find("from Domain as d order by last,first desc")


我认为一个标准是最好的选择,但是你做了正确的事情,首先尝试了一个查找器。从GORM检索域对象时,正确的尝试顺序是:dynamic finder、criteria、HQL。

criteria answer似乎对我不起作用;按顺序排列
“last,first”
只会导致异常,如
“Property”last,first“not found”
。要在两个字段上排序,可以执行以下操作:

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}

此查询是在第一个字段的基础上进行的。当第一个字段为空时,第二个字段将对其短路

order('last','desc')
order('first','desc')

这是相当古老的,但帮助我找到了一个合适的解决方案。使用withCriteria快捷方式的“cleaner”代码示例:

def c = MyDomain.withCriteria {
    and {
        order('last', 'desc')
        order('first', 'desc')
    }
}

更复杂的排序标准(在Grails2.1.0中测试)

首先按MyDomain.property排序。最后按MyDomain排序。首先可以这样做

def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
这行代码将首先按姓氏,然后按人名对域类“MyDomain”的结果进行排序

MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
使用grails数据存储gorm:6.0.3时,我也有同样的问题。 由于我的列表不太大,我使用groovy排序,因为我想对链接域的字段进行排序: 日历数据->景点

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}

“and”块在这里是必要的吗?@Matt Lachman:有趣的是,我认为围绕一个标准有一个隐含的
。你能解释一下没有
会发生什么吗?也许我有点太匆忙了。我收回我的评论:它在Grails2.3.7中没有外部
块的情况下也能工作。到目前为止,这绝对是最干净的解决方案。我不希望我们能做得更好。不确定为什么它被标记为否定,但第一种方法Mydomain.find肯定有效。也许他在上面有一些打字错误,但这不是减号的理由+1.来自我。5年前工作;)遗憾的是我不能删除它。哦,我多么不喜欢人们对曾经工作过的东西投否决票。org.hibernate.QueryException:无法解析属性:last,first of:MyDomain at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1616)。这个解决方案对我来说适用于grails 4.0.3和GORM 7.0.4。您还可以执行类似于
Person.findByUsername(用户名,[sort:['lastName':'asc','firstName':'asc']])的操作。
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}