Список сортировки или getAll в Grails

Я хотел реализовать порядок сортировки по умолчанию в своем доменном классе и сразу обнаружил, что он не работает с методом getAll. Ничего страшного, я просто использовал вместо этого list. Дело в том, что порядок сортировки по умолчанию в доменном классе не позволяет указать несколько полей сортировки (. как видно здесь).

Моя цель — отсортировать все объекты Fooсначала по имени их объекта Bar, а затем по их собственному имени.

class Foo {
    String name
    String Bar
}

class Bar {
    String name
}

Как я могу реализовать это в классе домена, чтобы мне не приходилось указывать длинный/неприятный компаратор каждый раз, когда я вызываю .list()?

Одна из моих попыток:

static Comparator getComparator() { 
    def c = { a, b -> 
    def result = a.bar.name.compareTo( b.bar.name ); 
        if ( result == 0 ) {
            result = a.name.compareTo( b.name );
        }
    }
    return c as Comparator
}

Тогда я мог бы просто позвонить Foo.list(Foo.getComparator())... если бы я мог заставить его работать.

Обновление:

Я думаю, что я действительно близок к этому, просто у меня проблемы с реализацией двух сравнений в одном и том же замыкании сортировки.

Foo.list().sort{ a, b ->
    def result = a.bar.name <=> b.bar.name;
    // Things mess up when I put this if statement in.
    if( result == 0 ) {
        a.name <=> b.name
    }
}

Дискотека!

class Foo { // My domain class
    //...

    static Comparator getComparator() {
        def c =[
            compare: { a, b ->
                def result = a.bar.name <=> b.bar.name;
                if( result == 0 ) {
                    result = a.name <=> b.name
                }
                return result
            }
        ] as Comparator
    }

    //...
}

И так реализовано в моем контроллере:

Foo.list().sort( Foo.getComparator() )

PS:

Вышеприведенное работает, но Джефф Стори опубликовал некоторый код в своем ответе после того, как я понял, и его код работает и намного лучше, чем мой, так что используйте его:)

0
задан Community 23 May 2017 в 11:52
поделиться