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

标签 grails collections groovy closures collect

我有一个这样的课:

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对象的ID的唯一列表,如下所示:
[ 1, 2, 3, 4 ]

我已经尝试过collect方法的各种变体,也曾经尝试过spread operator,但是我没有任何运气。

最佳答案

对于通用的Groovy类(即非GORM类),David是正确的,最好使用flattenunique

但是,在您的示例中,您似乎正在以多对多关系使用GORM域对象(否则,您将不需要唯一性约束)。

对于域类,最好使用HQL或标准一步完成。另一个优点是为其生成的SQL效率更高。

这是HQL,用于获取与多对多关系中的任何Bar相关的唯一Foo id:

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

关于grails - 如何使Groovy/Grails返回对象列表而不是对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129815/

相关文章:

grails - 耐火 Material 处理不当

grails - 将Javascript变量传递到taglib方法调用Grails中

java - 更新记录时如何使用替换方法?

spring - 将 grails 应用程序构建为从另一个项目引用的依赖项?

grails - 测试应用期间服务中服务注入(inject)的 NullPointerException

java - 为 webapp 存储临时数据的最佳实践

swift - 反向压缩一个集合

VBA循环遍历集合

Groovy:构造函数问题

jenkins - 如何在 Jenkins 声明性管道脚本 block 内循环分配 env