更新:可能与 2.0.1 中的这个 Grails 错误有关:http: //comments.gmane.org/gmane.comp.lang.groovy.grails.user/125400
更新2:这让我最接近,但分页不起作用。在这种情况下,所有的 A 都被返回,每个 A 都有它们的 B 列表,每个 B 都有它的 C。只要我添加了 offset 和 max,事情就会变得一团糟。例如,在这种情况下,不会返回 10 个 A。可能会退回 1 个 A 和 9 个 B。
def results = A.list([fetch:[bees: "eager"], offset: 0, max: 10]);
问题:我想在一个查询中加载所有 A、它们关联的 B 和 B 关联的 C。在一个查询中检索所有 A 及其关联的 B 非常简单。我不确定如何将所有 B 的 C 作为同一个查询的一部分加载。按照设计,从 B -> C 的默认映射应该是急切的,因为我在加载 B 时总是需要 C。我认为设置此映射可以解决问题。
class A {
static hasMany = [
bees: B,
]
}
class B {
C c;
static belongsTo = [a: A]
// also tried this and every possible combination
//static fetchMode = [c: 'eager']
static mapping = {
c fetch: 'join'
// c lazy: 'false'
}
}
class C {
String someField;
}
这是我的查询:
def results = A.executeQuery("from A a left join fetch a.bees",
[max: pageSize, offset: offset]);
如果我现在迭代结果:
for (A a in results) {
for (B b in a.bees) {
println "B: " + b; // this is OK, B is already loaded
println "B's C: " + b.c.someField; // C not loaded
}
}
当我迭代结果时,行 bcsomeField 将导致每个 B 执行一个“选择”。这很糟糕,我想尽可能避免这种情况。我发布了一个解决方案作为答案,它使用带有查找图的第二个查询,但必须有更好的方法。
我在“更新 2”中发布的查询让我非常接近。事实上,在我使用分页(使用偏移量/最大值)之前它工作得很好。Grails 用户指南提到“fetch: 'join' 可能会导致带有偏移量/最大值的查询出现问题,但它没有详细说明。注意:为了让这个查询正常工作,我必须禁用休眠查询缓存,如由于 Grails 2.0.1 中的错误,“更新 1”。
有任何想法吗?