grails中的Createcriteria与count on hasMany关系

grails中的Createcriteria与count on hasMany关系,grails,criteria,hibernate-criteria,Grails,Criteria,Hibernate Criteria,我有两节课 Quiz{ String name static hasMany[tags:Tag] } Tag{ String tag } 如何使用criteria builder在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
}
如何使用criteria builder在grails中编写以下查询

select count(tag_id),tag  from quiz_tag 
left outer join tag on tag_id=id
group by tag_id,tag

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

但在critera builder(即Hibernate)中,这似乎是不可能的,因为您无法从标记访问联接表。不过,您可以通过测验来完成,因为测验有
多个[tags: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更容易,但我想您也可以使用criteria builder来实现,如果支持的话,可以使用sqlGroupProjection进行分组。

如果您使用域类映射多对多表,您可以使用criteria查询来实现这一点,如前所述


counts
变量将是
[标记对象,标记计数]
列表的
列表

我遇到了一个类似的问题,客户与商店有一个或多个关联。 可以使用以下代码使用标准来计算存储

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]

您知道如何使用criteriaBuilder执行此操作吗?唯一的原因是很多“数据存储”主要是NoSql不支持HQL。我不确定criteriaBuilder是否会得到支持,但可能性更大!顺便说一句,关于查询的目的,您是对的,就像这样,我希望能够显示哪个标记使用最多,并以“流行度”的顺序显示它。如果我尝试您建议的域类[class com.easytha.quick]和[class com.easytha.tag]之间没有定义所有者的关系,我会遇到这个异常在多对多关系中。示例:static belongsTo=com.easytha.Tag->He schmolly,我一直在尝试这样做,但我得到了一个错误“列“quick\u ID”不允许为NULL”;SQL语句:插入quick\u标记(ID、版本、创建日期、上次更新、标记ID、标记ID、标记idx)值(NULL、、、、、、)[23502-164]”有什么想法吗?我有很多=[quizTags:quizTag]你能相信吗?我在发布最后一条消息几分钟后修复了它:)嘿,Schmolly,我试着完全按照你在这里说的做,但现在我的代码在其他地方出错了!你能看看我的另一个问题吗?以防万一,你可能会有答案?
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]
    }
}