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

时间:2015-10-08 23:01:57

标签: grails gorm

我有一个列表需要按3个不同的字段排序。如果是查询我可以做类似的事情:

and {
    invoiceTicketDetail {
        order('date', 'asc')
        order('xrefCode', 'asc')
    }
    order('lineType')
}

但我已经拥有如下列表:

List<InvoiceDetail> invoiceDetailList = invoiceHeader.invoiceDetails.findAll {it.deleted==Boolean.FALSE && it.amount!=0} as List

如何命令从第一个获得相同的结果?问题是我们有两种不同的方式来显示信息。一个用于在屏幕上打印,另一个用于生成报告。它们都必须以相同的类型显示信息。

3 个答案:

答案 0 :(得分:1)

您可以在标准中执行以下操作:

{
  order('date,xrefCode,lineType','asc')
}

或写查询:

Clazz.find("from Clazz order by date,xrefCode,lineType asc")

Clazz 是您的域

答案 1 :(得分:0)

您可以通过...

按多个条件(字段,属性等)进行排序
  1. 比较第一个属性
  2. 如果第一个属性比较结果为0(表示它们相等),则继续执行下一个属性。否则,请考虑排序的两个项目。
  3. 这是一个闭包,可以用一个属性名称列表进行curry,然后传递给# I use an exagerated number to remind you it is very large and won't fit the memory in your master so collect wouldn't work my_rdd = sc.parallelize(xrange(100000000000000000)) print my_rdd.take(100) Iterable.sort(boolean, Closure)

    Iterable.toSorted(Closure)

    实施例

    以下是如何使用闭包。

    def sortByProperties = { List propertyNames, Object a, Object b ->
        propertyNames
            .collect { a[it] <=> b[it] }
            .find { it != 0 }
    }
    

    输出看起来像这样。

    def date1 = new Date() + 3
    def date2 = new Date() - 2
    
    def list = [
        [date: date1, xrefCode: 2, lineType: 'b'],
        [date: date2, xrefCode: 2, lineType: 'c'],
        [date: date2, xrefCode: 1, lineType: 'c'],
        [date: date1, xrefCode: 2, lineType: 'a']
    ]
    
    def sortByProperties = { List propertyNames, Object a, Object b ->
        propertyNames
            .collect { a[it] <=> b[it] }
            .find { it != 0 }
    }
    
    // This form requires Groovy >= 2.4
    def sortedList = list.toSorted(sortByProperties.curry(['date', 'xrefCode', 'lineType']))
    
    // An alternative.
    def sortedList = list.sort(false, sortByProperties.curry(['date', 'xrefCode', 'lineType']))
    

答案 2 :(得分:0)

那么,

我为解决这个问题做了些什么:

  • 创建了我自己的比较器,当我得到列表时,我调用了类似的东西:

Collections.sort(list,new MyComparator());

在屏幕上显示之前和生成报告之前。 这解决了我的问题。