2015-10-08 3 views
1

У меня есть список, который нужно сортировать по 3 различным полям. Если бы это был вопрос, я мог бы сделать что-то вроде:Как сортировать по нескольким полям в Grails?

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 

Как я могу заказать, чтобы получить тот же результат с первого? Дело в том, что у нас есть два разных способа отображения информации. Один для печати на экране и один для создания отчета. Оба они должны показывать информацию в том же виде.

+0

Я думаю, что более чистый код выйдет, просто используя критерии. – Neoryder

ответ

1

Вы можете сделать, как это в ваших критериях:

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

или написать запрос:

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

Clazz Ваш домен

0

Вы можете сортировать по нескольким условиям (полей, свойств и т. д.) ...

  1. Сравнение первого свойства
  2. Если первые результаты сравнения свойств в 0 (что означает, что они равны), продолжайте следующее свойство. В противном случае рассмотрите два отсортированных элемента.

Вот замыкание, которое может быть curry'ed со списком имен свойств, а затем перешел к 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'])) 

Результат выглядит следующим образом.

[ 
    [date:Tue Oct 06 20:13:13 EDT 2015, xrefCode:1, lineType:c], 
    [date:Tue Oct 06 20:13:13 EDT 2015, xrefCode:2, lineType:c], 
    [date:Sun Oct 11 20:13:13 EDT 2015, xrefCode:2, lineType:a], 
    [date:Sun Oct 11 20:13:13 EDT 2015, xrefCode:2, lineType:b] 
] 
0

Ну,

Что я сделал, чтобы решить эту проблему:

  • создал свой собственный компаратор и когда я получил список я назвал что-то вроде:

Collections.sort (список, новый MyComparator());

Перед отображением на экране и перед созданием отчета. Это решило мою проблему.

Смежные вопросы