我想在我的域类中实现默认排序顺序,并立即发现它不适用于该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:
以上工作,但杰夫斯托里在我发现后在他的答案中发布了一些代码,他的代码工作并且比我的好得多,所以使用它:)