2013-03-05 40 views
0

我有过一个多一对多的关系,项目ProjectCategory,其中的项目可以有很多类别相关的两个域,和一类可能被分配到几个项目。所以:Grails的标准HQL多到许多与组由

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

,问题是,如何做到这一点使用标准或HQL,东西看起来更“Grails/Groovy风格”?

在此先感谢。

编辑

我已经成功在HQL解决:

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

看在预测:http://grails.org/doc/2.0.x/ref/Domain%20Classes/createC riteria.html – 2013-03-05 16:01:30

+0

我发现这篇关于具有投影的命名查询的文章,以供进一步参考:http://wiredforcode.com/blog/2011/03/20/named-queries-with-projections-in-grails/ – Uilian 2013-03-06 12:44:20

回答

2

使用标准的API和预测,让你这样的事情:

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

谢谢!工作很好!请告诉我,为什么我需要使用createAlias?本[Grails标准参考]手册的“标准”部分没有提及(http://grails.org/doc/latest/ref/Domain%20Classes/createCriteria.html)。 – Uilian 2013-03-05 20:18:04

+0

Grails标准API是Hibernate标准API之上的一个精简(有限)包装器。您可以通过查看[HibernateCriteriaBuilder](http://grails.org/doc/latest/api/grails/orm/HibernateCriteriaBuilder.html)javadoc来查看可用的操作,并阅读Hibernate文档部分中有关标准的内容这些方法的更多细节。在这种情况下,您不能将关联用作“groupProperty”,但可以为关联使用命名别名。 (即'groupProperty('categories.name')'不起作用) – codelark 2013-03-05 20:58:37

+0

谢谢,我将在本文档中“钻研”,因为我无法避免:) – Uilian 2013-03-05 22:58:33