无法对hasMany关系进行排序

时间:2013-03-25 10:06:17

标签: grails groovy

我正在尝试对对象列表进行排序,我在网上搜索,但我不明白为什么它不起作用。

这是我的域类,其中包含我要排序的列表:

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 个答案:

答案 0 :(得分:5)

默认情况下,

hasManySet支持。尝试将其更改为List,例如:

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

答案 1 :(得分:3)

默认情况下,您有两种方法对对象进行排序。两者都在可排序的类中:

  1. (对于简单的排序算法):

    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
        }
    
    }
    
  3. 您的问题可能是特殊班级LocalDate的排序算法。

答案 2 :(得分: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 {it.date} .reverse()会得到正确的结果。