gpt4 book ai didi

grails - 实体之间的关系标准-Grails

转载 作者:行者123 更新时间:2023-12-02 15:52:23 26 4
gpt4 key购买 nike

我有一个包含以下实体的应用:

主题:

class Topic {

UUID id
String description
String name
boolean visibility = true

// Relation
static hasMany = [tests:Test]
...
}

测试:
class Test {

UUID id
boolean active = true
String description
...

static hasMany = [evaluationsTest: Evaluation]
static belongsTo = [topic: Topic, catalog: Catalog]
}

当我向用户显示所有可见主题时,我请求查询:
def visibleTopics = Topic.findAllByVisibility(true, [sort:"name", order:"asc"])

该查询例如返回给我: [['English'], ['Spanish']]。然后,我可以向用户显示有关每个主题的完整信息。

但我也想向用户指出每个可见主题中的 Activity 测试数量。

例如:
English topic has 2 active test.
Spanish topic has a total of 2 test. One is active and the other is not.
German topic has not any active test.

然后,我需要一个查询,其结果是: def activeTotalEachTopic = [[2],[1],[0]],我可以将 activeTotalEachTopic变量传递给 View (.gsp)。

解决方案:

从可以获取所有可见主题的第一个查询中,我可以获得 Activity 测试的数量。
def visibleTopics = Topic.findAllByVisibility(true, [sort:"name", order:"asc"])

def numberActiveTest = []

activeTopics.each { topic ->
def result = Test.findAllByTopicAndActive(topic, true).size()
numberActiveTest.push(result)
}

我将两个变量都传递给 View 。
render view: 'home', model: [activeTopics: activeTopics, numberActiveTest: numberActiveTest]

最佳答案

您缺少的是分组,这样您可以得到每个组的计数,而不是总计数。

您还需要将联接类型从默认的内部联接更改为外部联接,以使没有 Activity 测试的主题返回0。但是,这样做的副作用是由于别名,它会更改引用关联属性的方式是由联接创建的。像这样:

import static org.hibernate.sql.JoinType.*

def activeTotalEachTopic = Topic.createCriteria().list() {
createAlias('tests', 't', LEFT_OUTER_JOIN)

eq 'visibility', true

or {
eq 't.active', true
isNull 't.id'
}

projections {
groupProperty 'name'
count()
}
order ("name", "asc")
}

现在,要解决的另一个问题是,由于分组,输出将类似于以下内容: [['English', 2],['Spanish', 1],['German', 0]]。因此,您可以做的是收集每个子列表中的第二项:
activeTotalEachTopic*.getAt(1)

// Which is the equivalent of...

activeTotalEachTopic.collect { it[1] }

关于grails - 实体之间的关系标准-Grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com