2013-03-25 6 views
0

Я пытаюсь сортировать список объектов, я искал в сети, и я не понимаю, почему он не работает.Не удается сортировать hasMany отношения

Вот мой домен класс, содержащий список, который я хочу, чтобы отсортировать:

class MyClass { 
    Integer bar 
    static hasMany = [**foos : Foo**] 
} 

объект Foo выглядеть следующим образом:

class Foo { 
    LocalDate day 
    String name 
} 

Я хочу, чтобы отсортировать FOOS по дате. Так что я пытался написать:

MyClass myClass = new MyClass() 
//foos contains 10 days. 
myClass.foos = myClass.foos.sort { it.day } 

Я не понимаю, где это ошибка, и почему мой список не отсортирован. Может ли кто-нибудь помочь?

Спасибо.

+3

'myClass.foos.toList() {рода it.day}' –

ответ

3

У вас есть два способа сортировки объектов по умолчанию. Оба находятся внутри сортируемого класса:

  1. (для простого alogorithms сортировочного):

    static mapping = { 
        sort 'dateCreated':'desc' 
    } 
    
  2. (для сложных алгоритмов сортировки вы используете функцию):

    class Target implements Comparable { 
    
    ... 
    
        int compareTo(o) { 
    
         if(o instanceof Target) { 
          Target t = (Target) o 
          // sort multidimensional 
          return (this.target_definition_order <=> t.target_definition_order ?: 
          this.target_order <=> t.target_order) 
         } else 
          return 0 
        } 
    
    } 
    

Ваша проблема может быть алгоритмом сортировки специального класса LocalDate.

+0

Мой класс не сохраняется (не КартаЧто = "никто") Я думаю, что я могу. Использовать сортировку в статическом блоке сопоставления. Я попробую метод с compareTo(). Благодарю. – Hito

0

Используя код при условии сортировки работает, если вы используете объект Date вместо LocalDate ..

 use(TimeCategory) { 
      MyClass myClass = new MyClass(bar: 1) 
      Date today = new Date() 
      def foo = new Foo(name: "a", day: today) 
      myClass.addToFoos(foo) 
      myClass.save(flush: true) 
      foo = new Foo(name: "a", day: today+1.second) 
      myClass.addToFoos(foo) 
      foo = new Foo(name: "a", day: today+2.second) 
      myClass.addToFoos(foo) 
      foo = new Foo(name: "a", day: today+3.second) 
      myClass.addToFoos(foo) 
      foo = new Foo(name: "a", day: today+4.second) 
      myClass.save(flush: true) 
     } 

Использование myClass.foos.sort {it.date} или {myClass.foos.sort его. date} .reverse() дает правильный результат.

5

hasMany по умолчанию соответствует Set. Попробуйте изменить его к List, например:

class MyClass { 
    Integer bar 
    List foos 
    static hasMany = [foos : Foo] 
} 
Смежные вопросы