好的,我想知道实现方案的最佳方法是什么。
我的对象如下:
ProjectCategory有许多项目。项目具有ProjectStatus。 ProjectStatus有一个名为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
实例时,可以使用openedProjectsCount
属性:def projectCategory = ProjectCategory.get(123)
projectCategory.openedProjectsCount