我继承了一个相当复杂的常规应用程序,并试图理解如何更好地解决目前存在的一些讨厌的查询模式。
简单地说,我有类似的东西:
Class A {
User user
Bravo bravo
static hasMany = [foo: Foo, bar: Long]
}
Class Foo {
User user
Delta delta
static belongsTo = [a: A]
static hasMany = [woo: Woo]
}
Class Woo {
User user
Alpha alpha
static belongsTo = [foo: Foo]
}
我正在尝试A.findAllByUser(user)
给我<List>A
,但是当我开始查看该列表时,我正在点击数百个进一步构建bravo
的查询和foo
。
我试图将Foo fetch:"join"
添加到Foo类并将Woo fetch: "join"
添加到Woo类,但是这意味着触及这两个的每个查询将始终进行这些查询(并且仍然无法解决数百个查询点击bravo
。
在使用HQL方面,我是一个相当新手,但这会导致一些严重的性能问题和大规模的大型查询。有没有更好的方法来解决这个问题(并希望避免数百个选择查询)?
答案 0 :(得分:1)
看起来您正在使用GORM(这是Grails框架使用的ORM)。
要解决您的问题,您需要确定最常见的用例。如果您希望在默认情况下继续延迟抓取,则可以在需要时在本地更改抓取策略:A.findAllByUser(user, [fetch: join])
。
另一方面,如果您想要提取默认但希望在本地禁用它,我相信您应该在域类中使用lazy: false
而不是fetch: join
,因为它更安全对多个协会。您应该可以针对任何给定的查询禁用它(例如A.findAllByUser(user, [lazy: true])
。
请参阅here。