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

2023-12-20

我有一堂这样的课:

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 ]

我的最终目标是拥有一个唯一的 id 列表Bar上面列表中的对象,如下所示:

[ 1, 2, 3, 4 ]

我尝试过的变体collect http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#collect%28groovy.lang.Closure%29方法,我也尝试过扩展运算符 http://groovy.codehaus.org/Operators#Operators-SpreadOperator但我没有任何运气。


对于通用的 groovy 类(即非 GORM 类),David 是正确的,使用flatten and unique是最好的方法。

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

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

这是获取唯一的 HQLBar与任何相关的 idFoo在多对多关系中:

Bar.executeQuery("select distinct b.id from Foo f join f.bars b")

其标准如下:

Foo.withCriteria {
    bars {
        projections {
          distinct("id")
        }
    }
}

使用这种方法的一个“问题”是单元测试不支持 HQL(并且可能永远不会支持)并且带有连接表投影的条件查询在 2.0.4 单元测试中被破坏 http://jira.grails.org/browse/GRAILS-9161。因此,围绕此代码的任何测试都需要进行模拟或使用集成测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 Groovy / Grails 返回对象列表而不是对象列表列表? 的相关文章

随机推荐