2

我有两节课

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
4

3 回答 3

3

如果您将多对多表与域类映射,您可以使用条件查询来执行此操作,如此所述。

class QuizTag {
    Quiz quiz
    Tag tag

    ...
}

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

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

于 2012-10-06T04:25:35.500 回答
0

您似乎想知道每个标签在测验中使用了多少次。通过像你一样定义你的域类,你得到了一个中间表 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 进行分组。

于 2012-10-05T12:03:10.040 回答
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]

于 2014-09-17T10:01:56.407 回答