加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使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.因此,围绕此代码的任何测试都需要进行模拟或使用集成测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读