使用hasMany关系计算grails中的创建标准

时间:2012-10-05 03:58:39

标签: grails criteria hibernate-criteria

我有两个班级

Quiz{
  String name
  static hasMany[tags:Tag]
}

Tag{
    String tag
}

如何使用条件构建器

在grails中编写以下查询
select count(tag_id),tag  from quiz_tag 
left outer join tag on tag_id=id
group by tag_id,tag

3 个答案:

答案 0 :(得分:3)

如果您使用域类映射多对多表,则可以使用条件查询执行此操作,如解释here

class QuizTag {
    Quiz quiz
    Tag tag

    ...
}

def counts = QuizTag.withCriteria {
    projections {
        groupProperty('tag')
        rowCount()
    }
}

counts变量将是List[Tag object, count of the Tag]列表。

答案 1 :(得分:0)

您似乎想知道测验中每个标记使用了多少次。 通过像你一样定义域类,你得到了一个中间表quiz_tag,通过使用行SQL你可以找到这个问题的结果。

但似乎这对critera构建器来说是不可能的,那就是Hibernate,因为从Tag中你无法访问连接表。你可以从测验中做到这一点,因为测验有hasMany[tags:Tag]

如果您按照以下方式修改,可以从Tag访问联接表:

Tag{
    String tag

    static belongsTo = Quiz
    static hasMany[quizes:Quiz]
  }

您的数据库模型保持不变,但现在Hibernate可以从Tag转到连接表。您可以尝试这个HQL查询,它将为您提供测验中的标记和出现次数:

Tag.executeQuery("SELECT t, count(q) FROM Tag t JOIN FETCH t.quizes q GROUP BY t")

我认为只使用HQL会更容易,但我想你也可以使用条件构建器,也可以使用sqlGroupProjection进行分组(如果支持)。

答案 2 :(得分:0)

我遇到了类似的问题,顾客与商店有很多关联。 可以使用以下代码使用条件来计算商店。

class Customer {
    static hasMany = [stores : Store]
    ... 
}

class Store {
    Customer customer
    ...
}

def c = Store.createCriteria()
def results = c.list {
    customer {
        'in'("customerNumber",['1-1','1-2','1-3'])
    }
    projections {
        sqlGroupProjection 'customer_id, count(customer_id) as numberOfStores', 'customer_id', ['customer_id', 'numberOfStores'], [INTEGER, INTEGER]
    }
}

结果:[[1,3],[2,3]]

返回字段为[customer.id,numberOfStores]