Hibernate Grails标准HQL多对多和group by

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

我有两个通过多对多关系关联的域,ProjectProjectCategory,其中项目可以有多个类别,一个类别可以分配给多个项目。因此:

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')
不起作用)谢谢,我将“深入”这篇文档,因为我再也无法避免:)