我有一个这样的课:
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.因此,围绕此代码的任何测试都需要进行模拟或使用集成测试.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。