我有一个这样的课:
class Foo {
static hasMany = [bars: Bar]
}
当我写的时候:
Foo.getAll()
我得到了像这样的
Foo
对象的列表:[ Foo1, Foo2, Foo3 ]
当我写的时候:
Foo.getAll().bars
我得到像这样的
Bar
对象列表的列表:[ [ Bar1, Bar2 ], [ Bar2, Bar3 ], [ Bar1, Bar4 ] ]
但是我想要的是
Bar
对象的唯一列表,如下所示:[ Bar1, Bar2, Bar3, Bar4 ]
我的最终目标是在上面的列表中具有
Bar
对象的ID的唯一列表,如下所示:[ 1, 2, 3, 4 ]
我已经尝试过collect方法的各种变体,也曾经尝试过spread operator,但是我没有任何运气。
最佳答案
对于通用的Groovy类(即非GORM类),David是正确的,最好使用flatten
和unique
。
但是,在您的示例中,您似乎正在以多对多关系使用GORM域对象(否则,您将不需要唯一性约束)。
对于域类,最好使用HQL或标准一步完成。另一个优点是为其生成的SQL效率更高。
这是HQL,用于获取与多对多关系中的任何Bar
相关的唯一Foo
id:
Bar.executeQuery("select distinct b.id from Foo f join f.bars b")
其标准如下所示:
Foo.withCriteria {
bars {
projections {
distinct("id")
}
}
}
使用这种方法的一个“问题”是,单元测试和Criteria queries with join table projections are broken in 2.0.4 unit tests不支持HQL。因此,围绕此代码的任何测试都将需要模拟或使用集成测试。
关于grails - 如何使Groovy/Grails返回对象列表而不是对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129815/