如何使Groovy / Grails返回一个对象列表而不是一个对象列表?
发布时间:2020-12-14 16:31:48 所属栏目:大数据 来源:网络整理
导读:我有一个这样的课: class Foo { static hasMany = [bars: Bar]} 我写的时候: Foo.getAll() 我得到一个像这样的Foo对象列表: [ Foo1,Foo2,Foo3 ] 我写的时候: Foo.getAll().bars 我得到一个Bar对象列表列表,如下所示: [ [ Bar1,Bar2 ],[ Bar2,Bar3 ],[ B
我有一个这样的课:
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对象列表,如下所示: [ 1,2,3,4 ] 我尝试了collect方法的变种,我也尝试了spread operator,但我没有运气. 解决方法
对于通用的groovy类(即非GORM类),David认为使用flatten和unique是最好的方法.
在您的示例中,看起来您在多对多关系中使用GORM域对象(否则您将不需要唯一性约束). 对于域类,您最好使用HQL或条件一步完成此操作.另一个优点是为它生成的SQL效率更高. 以下是用于获取与多对多关系中的任何Foo相关的唯一Bar ID的HQL: 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.因此,围绕此代码的任何测试都需要进行模拟或使用集成测试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |