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

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...