Hibernate Grails标准HQL多对多和group by
我有两个通过多对多关系关联的域,Project和ProjectCategory,其中项目可以有多个类别,一个类别可以分配给多个项目。因此:Hibernate Grails标准HQL多对多和group by,hibernate,grails,hql,criteria,Hibernate,Grails,Hql,Criteria,我有两个通过多对多关系关联的域,Project和ProjectCategory,其中项目可以有多个类别,一个类别可以分配给多个项目。因此: class ProjectCategory { String name ... } class Project { static hasMany = [categories : ProjectCategory] ... } 我想计算每个类别有多少个项目。实现这一点的SQL非常简单: select cat.name category
class ProjectCategory {
String name
...
}
class Project {
static hasMany = [categories : ProjectCategory]
...
}
我想计算每个类别有多少个项目。实现这一点的SQL非常简单:
select cat.name category, count(pcat.project_categories_id ) projCount
from project_project_category pcat,
project_category cat
where pcat.project_category_id = cat.id
group by project_category_id
返回如下内容:
category | projCount
'cat_1' | 3
'cat_2' | 4
'cat_3' | 1
...
def results = Project.createCriteria().list() {
createAlias('categories', 'catalias')
projections {
groupProperty('catalias.name')
count('id')
}
}
现在的问题是,如何使用更“Grails/Groovy风格”的标准或HQL来实现这一点
提前谢谢
编辑
我已设法在HQL中解决了以下问题:
使用criteria API和projections可以得到如下结果:
category | projCount
'cat_1' | 3
'cat_2' | 4
'cat_3' | 1
...
def results = Project.createCriteria().list() {
createAlias('categories', 'catalias')
projections {
groupProperty('catalias.name')
count('id')
}
}
查看投影:我发现了这篇关于带投影的命名查询的文章,供进一步参考:谢谢!很好!请告诉我,为什么我需要使用createAlias?手册中的“标准”部分没有提到这一点。grails标准API是Hibernate标准API之上的一个薄(有限)包装器。通过查看javadoc,您可以看到哪些操作可用,并阅读Hibernate文档中关于条件的部分,以了解这些方法的更多细节。在这种情况下,不能将关联用作
groupProperty
,但可以为关联使用命名别名。(即,groupProperty('categories.name')
不起作用)谢谢,我将“深入”这篇文档,因为我再也无法避免:)