我有两节课
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
我有两节课
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
如果您将多对多表与域类映射,您可以使用条件查询来执行此操作,如此处所述。
class QuizTag {
Quiz quiz
Tag tag
...
}
def counts = QuizTag.withCriteria {
projections {
groupProperty('tag')
rowCount()
}
}
该counts
变量将是一个List
列表[Tag object, count of the Tag]
。
您似乎想知道每个标签在测验中使用了多少次。通过像你一样定义你的域类,你得到了一个中间表 quiz_tag,通过使用行 SQL,你可以找到这个问题的结果。
但似乎这对于 critera builder 是不可能的,即 Hibernate,因为从 Tag 你不能访问连接表。你可以从测验中做到这一点,因为测验有hasMany[tags:Tag]
如果您像这样修改它,您可以从 Tag 访问连接表:
Tag{
String tag
static belongsTo = Quiz
static hasMany[quizes:Quiz]
}
您的数据库模型保持不变,但现在 Hibernate 可以从标记转到连接表。你可以试试这个 HQL 查询,它会在测验中给你标签和出现次数:
Tag.executeQuery("SELECT t, count(q) FROM Tag t JOIN FETCH t.quizes q GROUP BY t")
我认为仅使用 HQL 会更容易,但我想您也可以使用标准构建器来完成,如果支持的话,也许可以使用 sqlGroupProjection 进行分组。
我有一个类似的问题,客户与商店有很多关联。可以使用以下代码使用标准来计算商店。
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]