【问题标题】:Lazy Eager loading Grails GORMLazy Eager 加载 Grails GORM
【发布时间】:2014-05-30 04:52:29
【问题描述】:

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

我的对象如下:

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

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

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

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

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

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

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

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    我会使用 HQL。假设项目属于 ProjectCategory,您可以在 ProjectCategory 类中添加类似的内容:

    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 属性:

    def projectCategory = ProjectCategory.get(123)
    projectCategory.openedProjectsCount
    

    【讨论】:

    • 您的方法 OP 的问题在于,它会查询并创建所有这些对象,只是为了对它们进行计数。相反,对数据库进行计数。这样会快得多。
    猜你喜欢
    • 2013-01-23
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2016-07-16
    • 2016-11-09
    • 2015-01-07
    相关资源
    最近更新 更多