gpt4 book ai didi

hibernate - 急于加载时,Grails条件查询将返回同一对象的多个副本

转载 作者:行者123 更新时间:2023-12-02 16:00:54 24 4
gpt4 key购买 nike

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

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

最佳答案

尝试在映射中指定急切加载:

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

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

}

然后,仅需获取框-如果您像在第二个示例中那样将大理石添加到条件中,那么您将连接框和大理石,并且将获得与预期数目相同的行数。
List boxes = Box.withCriteria() {
eq("id", 0)
}

关于hibernate - 急于加载时,Grails条件查询将返回同一对象的多个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30983969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com