这似乎是一个基本问题所以我认为我只是做了一些非常愚蠢的事情。我正在尝试导航大型对象结构,并希望在特定查询中急切地加载它们:
class Box {
String name
hasMany = [marbles:Marble]
static mapping = {
sort 'name'
}
}
和
class Marble {
String name
static belongsTo = Box
}
所以,如果我这样做:
List boxes = Box.withCriteria() {
eq("id", 0)
}
log.info("Boxes returned: ${boxes.size()")
我看到有一个盒子按预期返回,如果我试图急切加载弹珠,但是...
List boxes = Box.withCriteria() {
eq("id", 0)
marbles {}
}
log.info("Boxes returned: ${boxes.size()")
返回了129个盒子(或更准确地说,同一个盒子的129个副本,这对于“此盒子中的弹珠数”是正确的)。还有另外两层1:M关系我想在这里急切地加载...... 我需要做些什么来急切地加载关联,结果仍然只收到一个Box?
编辑:根据我在下面的评论,以下似乎可行。我很乐意继续寻求其他选择,但与此同时,“最佳”解决方案似乎是:
def c = Box.createCriteria()
c.listDistinct {
eq("id", 0)
marbles {}
}
答案 0 :(得分:0)
尝试在映射中指定预先加载:
class Box {
String name
hasMany = [marbles:Marble]
static mapping = {
sort 'name'
}
static fetchMode = [marbles: "eager"]
}
然后只需获取该框 - 如果您按照第二个示例中的标准添加大理石,那么您将加入框和弹珠,您将获得与预期的大理石相同的行数。
List boxes = Box.withCriteria() {
eq("id", 0)
}