当急切加载时,Grails条件查询返回同一对象的多个副本

时间:2015-06-22 15:29:47

标签: hibernate grails criteria

这似乎是一个基本问题所以我认为我只是做了一些非常愚蠢的事情。我正在尝试导航大型对象结构,并希望在特定查询中急切地加载它们:

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 {}
}

1 个答案:

答案 0 :(得分:0)

尝试在映射中指定预先加载:

class Box {
  String name
  hasMany = [marbles:Marble]

  static mapping = {
    sort 'name'
  }
static fetchMode = [marbles: "eager"]

}

然后只需获取该框 - 如果您按照第二个示例中的标准添加大理石,那么您将加入框和弹珠,您将获得与预期的大理石相同的行数。

List boxes = Box.withCriteria() {
  eq("id", 0)
}