微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使Groovy / Grails返回一个对象列表而不是一个对象列表?

我有一个这样的课:

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 举报,一经查实,本站将立刻删除。

相关推荐