Grails Criteria HQL与group by的多对多

时间:2013-03-05 15:27:30

标签: hibernate grails hql criteria

我有两个通过多对多关系相关的域名,项目 ProjectCategory ,其中项目可以有多个类别,一个类别可能会分配给多个项目。所以:

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
...

现在,问题是,如何使用Criteria或HQL执行此操作,这看起来更像“Grails / Groovy风格”?

提前致谢。

修改

我已成功解决 HQL

def result  = ProjectCategory.executeQuery(
    ''' select c.name, count(p.id)
          from Project p join p.categories c
         group by c ''' )

1 个答案:

答案 0 :(得分:2)

使用标准API和投影可以获得如下内容:

def results = Project.createCriteria().list() {
    createAlias('categories', 'catalias')
    projections {
        groupProperty('catalias.name')
        count('id')
    }
}