我有一堂这样的课:
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 ]
我的最终目标是拥有一个唯一的 id 列表Bar
上面列表中的对象,如下所示:
[ 1, 2, 3, 4 ]
我尝试过的变体collect http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#collect%28groovy.lang.Closure%29方法,我也尝试过扩展运算符 http://groovy.codehaus.org/Operators#Operators-SpreadOperator但我没有任何运气。
对于通用的 groovy 类(即非 GORM 类),David 是正确的,使用flatten
and unique
是最好的方法。
但在您的示例中,您似乎在多对多关系中使用 GORM 域对象(否则您不需要唯一性约束)。
对于域类,您最好使用 HQL 或标准一步完成此操作。另一个优点是为其生成的 SQL 更加高效。
这是获取唯一的 HQLBar
与任何相关的 idFoo
在多对多关系中:
Bar.executeQuery("select distinct b.id from Foo f join f.bars b")
其标准如下:
Foo.withCriteria {
bars {
projections {
distinct("id")
}
}
}
使用这种方法的一个“问题”是单元测试不支持 HQL(并且可能永远不会支持)并且带有连接表投影的条件查询在 2.0.4 单元测试中被破坏 http://jira.grails.org/browse/GRAILS-9161。因此,围绕此代码的任何测试都需要进行模拟或使用集成测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)