我有两个班级
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
答案 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]