Groovy和Hibernate - 一对多关系中的Performant查询

时间:2016-10-07 17:30:51

标签: performance hibernate groovy

我继承了一个相当复杂的常规应用程序,并试图理解如何更好地解决目前存在的一些讨厌的查询模式。

简单地说,我有类似的东西:

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方面,我是一个相当新手,但这会导致一些严重的性能问题和大规模的大型查询。有没有更好的方法来解决这个问题(并希望避免数百个选择查询)?

1 个答案:

答案 0 :(得分:1)

看起来您正在使用GORM(这是Grails框架使用的ORM)。

要解决您的问题,您需要确定最常见的用例。如果您希望在默认情况下继续延迟抓取,则可以在需要时在本地更改抓取策略:A.findAllByUser(user, [fetch: join])

另一方面,如果您想要提取默认但希望在本地禁用它,我相信您应该在域类中使用lazy: false而不是fetch: join,因为它更安全对多个协会。您应该可以针对任何给定的查询禁用它(例如A.findAllByUser(user, [lazy: true])

请参阅here