【问题标题】:Grails Criteria HQL Many-to-Many with group byGrails Criteria HQL 多对多与 group by
【发布时间】:2013-02-20 01:55:31
【问题描述】:

我有两个通过多对多关系关联的域,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
...

现在的问题是,如何使用 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 ''' )

【问题讨论】:

标签: hibernate grails hql criteria


【解决方案1】:

使用标准 API 和预测可以得到如下结果:

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

【讨论】:

  • 谢谢!工作得很好!请告诉我,为什么我需要使用 createAlias?手册的“标准”部分没有提及此Grails Criteria Reference
  • grails 标准 API 是在 Hibernate 标准 API 之上的一个精简(有限)包装器。您可以通过查看HibernateCriteriaBuilder javadoc 来查看可用的操作,并阅读有关标准的 Hibernate 文档部分以了解有关这些方法的功能的更多细节。在这种情况下,您不能将关联用作groupProperty,但您可以将命名别名用于关联。 (即groupProperty('categories.name') 不起作用)
  • 谢谢你,我会在这个文档中“深入研究”,因为我不能再避免了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多