【发布时间】:2010-09-24 11:21:18
【问题描述】:
有没有办法获得按两个字段排序的列表,比如姓氏和名字?
我知道.listOrderByLastAndFirst 和.list(sort:'last, first') 不起作用。
【问题讨论】:
标签: grails sql-order-by grails-orm
有没有办法获得按两个字段排序的列表,比如姓氏和名字?
我知道.listOrderByLastAndFirst 和.list(sort:'last, first') 不起作用。
【问题讨论】:
标签: grails sql-order-by grails-orm
Hates_ 标准答案似乎对我不起作用;将"last,first" 排序只会导致异常说"Property 'last,first' not found"。要对两个字段进行排序,您可以执行以下操作:
def c = MyDomain.createCriteria()
def results = c.list {
and{
order('last','desc')
order('first','desc')
}
}
【讨论】:
and。你能解释一下没有and会发生什么吗?
and 块的情况相同
这已经很老了,但帮助我找到了合适的解决方案。使用 withCriteria 快捷方式的“更干净”的代码示例:
def c = MyDomain.withCriteria {
and {
order('last', 'desc')
order('first', 'desc')
}
}
【讨论】:
这个旧的解决方案不再有效。请在下面查看 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")
}
【讨论】:
更复杂的排序标准,(在 Grails 2.1.0 中测试)
def c = MyDomain.withCriteria {
property {
order('last', 'desc')
}
order('first', 'desc')
}
首先按 MyDomain.property.last 排序,然后按 MyDomain.first 排序
【讨论】:
我认为标准是最好的选择,但您首先尝试查找器是正确的。从 GORM 检索域对象时,尝试的正确顺序是:动态查找器、条件、HQL。
【讨论】:
此查询基于第一个字段。当第一个字段为空时,它会被第二个字段短接。
order('last','desc')
order('first','desc')
【讨论】:
你可以这样做
def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
这行代码将首先按姓氏对域类“MyDomain”的结果进行排序,然后按人的名字排序。
【讨论】:
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
适用于 grails-datastore-gorm:6.0.3
【讨论】:
Person.findByUsername(username, [sort: ['lastName': 'asc', 'firstName': 'asc']])
如果您要根据项目的内容对列表进行排序,则需要实现一个比较器,该比较器具有一些智能功能,可以让您根据多个属性确定排序顺序。
Groovy 风格比较器的一些示例显示在here
但是,如果您正在排序的列表是从数据库查询中返回的,您最好使用 CrteriaQuery 对其进行排序并对其进行排序
【讨论】:
我也有同样的问题。 由于我的列表不是那么大,我使用 groovy 排序,因为我想对链接域的字段进行排序: CalendarData -> 景点
def listCalendar (Calendar calendar) {
respond CalendarData.where {
calendar == calendar
}.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}
【讨论】: