Я хотел реализовать порядок сортировки по умолчанию в своем доменном классе и сразу обнаружил, что он не работает с методом 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:
Вышеприведенное работает, но Джефф Стори опубликовал некоторый код в своем ответе после того, как я понял, и его код работает и намного лучше, чем мой, так что используйте его:)