2013-03-05 43 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