ドメインクラスにデフォルトの並べ替え順序を実装したかったのですが、すぐにgetAll
メソッドで機能しないことがわかりました。大したことではありません、私はlist
代わりに使用しました。重要なのは、ドメインクラスのデフォルトの並べ替え順序では、複数の並べ替えフィールドを指定できないことです(ここを参照)。
私の目標は、Foo
最初にすべてのオブジェクトをオブジェクトの名前で並べ替えBar
、次に自分の名前で並べ替えることです。
class Foo {
String name
String Bar
}
class Bar {
String name
}
これをドメインクラスに実装して、呼び出すたびに長い/厄介なコンパレータを指定する必要がないようにするにはどうすればよい.list()
ですか?
私の試みの1つ:
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())
...私がそれを動かすことができれば。
アップデート:
同じ種類のクロージャで2つの比較を実装するのに問題があるだけで、私はここに本当に近いと思います。
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:
上記は機能しますが、私がディスコした後、Jeff Storeyが彼の回答にいくつかのコードを投稿しました。彼のコードは機能し、私のコードよりもはるかに優れているので、それを使用してください:)