41

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

我知道.listOrderByLastAndFirst并且.list(sort:'last, first')不会工作。

4

10 回答 10

83

Hates_标准答案似乎对我不起作用;整理"last,first"只会导致异常说,"Property 'last,first' not found"。要对两个字段进行排序,您可以执行以下操作:

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}
于 2009-10-27T21:12:18.677 回答
10

这已经很老了,但帮助我找到了合适的解决方案。使用 withCriteria 快捷方式的“更简洁”代码示例:

def c = MyDomain.withCriteria {
    and {
        order('last', 'desc')
        order('first', 'desc')
    }
}
于 2011-09-02T00:45:44.340 回答
8

这个旧的解决方案不再有效。请参阅下面的mattlary答案

您可能必须在 HQL 中编写自定义查找器或使用 Criteria Builder。

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

或者

def c = MyDomain.createCriteria()
def results = c.list {
       order("last,first", "desc")
}
于 2008-11-28T16:17:52.873 回答
5

更复杂的排序标准,(在 Grails 2.1.0 中测试)

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

首先按 MyDomain.property.last 排序,然后按 MyDomain.first

于 2012-09-12T12:37:57.490 回答
4

我认为标准是最好的选择,但是您首先尝试查找器是正确的。从 GORM 检索域对象时,尝试的正确顺序是:动态查找器、条件、HQL。

于 2008-11-30T13:33:21.830 回答
4

此查询是在第一个字段的基础上工作的。当第一个字段为空白时,它会被第二个字段短接。

order('last','desc')
order('first','desc')
于 2009-11-04T05:06:04.733 回答
4

你可以这样做

def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);

这行代码将首先按姓氏对域类“MyDomain”的结果进行排序,然后按人的名字排序。

于 2014-05-29T04:45:03.927 回答
4
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])

适用于 grails-datastore-gorm:6.0.3

于 2018-05-04T11:39:20.277 回答
0

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

这里展示了一些 Groovy 风格的比较器示例

但是,如果您正在排序的列表是从数据库查询返回的,那么您最好使用 CrteriaQuery 对其进行排序并对其进行排序

于 2008-11-28T16:17:18.960 回答
0

我有同样的问题。由于我的列表不是那么大,我使用常规排序,因为我想对链接域的字段进行排序:CalendarData -> Attraction

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}
于 2018-07-05T15:13:48.080 回答