懒惰的渴望加载Grails GORM

懒惰的渴望加载Grails GORM,grails,lazy-loading,gorm,eager-loading,Grails,Lazy Loading,Gorm,Eager Loading,好的,我想知道实现我的场景的最佳方式是什么 我的目标如下: ProjectCategory有许多项目。项目具有项目状态。ProjectStatus有一个名为name的属性,name可以是“Closed”或“Open”等 我试图在页面上显示所有类别以及类别名称旁边该类别的已打开项目数 我该怎么做呢。我看到的问题是(使用grails gorm)默认情况下不能执行以下操作 category.findAll{ it.status.name == "Opened" }.size() 因为对象没有加载到

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

我的目标如下:

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

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

我该怎么做呢。我看到的问题是(使用grails gorm)默认情况下不能执行以下操作

category.findAll{ it.status.name == "Opened" }.size() 
因为对象没有加载到那么深。现在如果我强迫他们加载,现在对于所有类别,我可能加载一堆项目只是为了获得状态。你拥有的项目越多,系统的性能就不会受到很大的影响吗

一想到要在类别中创建一个计数器,并在项目状态每次更改时更新它,我就感到畏缩

我一定是被剥夺了睡眠,因为我看不出正确的方法是什么。如果我在.findAll中首先提到的方法是可行的,那么我真的需要担心性能吗?我将如何着手实施这一点


提前感谢您的帮助。

我会使用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
实例时,可以使用
openedprojectscont
属性:

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

您的方法OP的问题在于,它将查询并创建所有这些对象,只是为了对它们进行计数。而是对数据库进行计数。那会快得多。