grails - Lazy Eager 加载 Grails GORM

标签 grails lazy-loading grails-orm eager-loading

好的,我想知道实现我的场景的最佳方法是什么。

我的对象如下:

ProjectCategory 有许多项目。项目有一个 ProjectStatus。 ProjectStatus 有一个名为 name 的属性,名称可以是“Closed”或“Open”等...

我试图在页面上显示所有类别以及类别名称旁边该类别的已打开项目数。

我将如何去做。我看到的问题是(使用 grails gorm)默认情况下你不能做类似的事情

category.findAll{ it.status.name == "Opened" }.size() 

因为对象没有加载那么深。现在如果我强制他们加载,现在对于所有类别,我可能会加载一堆项目只是为了获得状态。您拥有的项目数量越多,系统的性能是否会受到巨大影响?

每当项目状态发生变化时,在类别中创建一个计数器并更新它的想法让我感到畏缩。

我一定只是被剥夺了 sleep ,因为我看不出这样做的正确方法是什么。如果我首先提到的 .findAll 方法是要走的路,我真的需要担心性能吗?我将如何实现呢?

提前感谢您的所有帮助。

最佳答案

我会使用 HQL。假设项目属于一个 ProjectCategory,您可以将这样的内容添加到您的 ProjectCategory类(class):

class ProjectCategory {

    // Fields/Methods

    def getOpenedProjectsCount() {
        ProjectCategory.executeQuery("SELECT count(*) FROM Projects p WHERE p.projectCategory = :projectCategory AND p.projectStatus.name = 'Opened'", [projectCategory: this])
    }
}

那么当你有一个 ProjectCategory您可以使用 openedProjectsCount 的实例属性(property):
def projectCategory = ProjectCategory.get(123)
projectCategory.openedProjectsCount

关于grails - Lazy Eager 加载 Grails GORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941140/

相关文章:

grails - 为什么 grails.gorm.autoFlush 设置为 true 不起作用?

grails - 在 Grails 中,当我们将 max 和 offset 值传递给 list 方法时,如何获得总结果数?

grails - 我的gsp中的Grails 3.0.9 createLink无法正常工作

grails - 在 grails 的 spring-security-core 插件中禁用用户身份验证

unit-testing - Grails 单元或集成测试?

java - 延迟加载展示 primefaces

c# - 如何延迟加载具有多行的标准 html 表?

java - 使用 Hibernate 延迟获取单列(类属性)

grails - 域有一些共同的领域,扩展域或嵌入?

Grails 域有很多建模