Lazy Eager正在加载Grails GORM

时间:2014-05-29 19:11:20

标签: grails lazy-loading gorm eager-loading

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

我的对象如下:

ProjectCategory有很多项目。项目有一个ProjectStatus。 ProjectStatus有一个名为name的属性,name可以是" Closed"或"打开"等...

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

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

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

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

在类别中创建计数器并在每次项目状态更改时更新它的想法让我感到畏缩。

我必须被剥夺睡眠,因为我无法看到这样做的正确方法。如果我首先提到.findAll的方式是要走的路,我真的要担心性能吗?我将如何实施?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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