gpt4 book ai didi

grails - 一对多关系的Grails准则动态AND条件

转载 作者:行者123 更新时间:2023-12-02 14:41:32 26 4
gpt4 key购买 nike

我有一个域名类(class)

class Url {
UUID id
String url
static hasMany = [
indications:UrlIndication
]
...
}


class UrlIndication  {
UUID id
String name

static belongsTo = Url
...

}

我想选择网址,以便它在给定列表 UrlIndication中具有所有必需的 indicationsId元素。
为此,我使用了像这样的关联 and标准:
indications {
and {
indicationsId.each{
indication->
eq ('id',UUID.fromString(indication as String))
}
}
}

但是,我得到的只是一个空洞的结果。您可以提出任何修改/其他方法以便我做到这一点吗?提前致谢

最佳答案

您的查询返回了一个空列表,因为它等同于表达式(伪代码):if 1 = 1 and 1 = 2 and 1 = 3
这样的表达总是错误的。由于描述了@innovatism,因此ininList无法使用。

从理论上讲,Criteria的eqAll()或HQL的= ALL将起作用。但是,我不确定,因为我无法任一个工作。

有效的方法是使用inList返回Urls的子集:包含至少一个UrlIndication ID的子集。然后使用Groovy的containsAll()完成该工作。

def ids = indicationsId.collect { UUID.fromString(it as String) }

Url.createCriteria()
.buildCriteria {
indications {
inList 'id', ids
}
}
.setResultTransformer(org.hibernate.Criteria.DISTINCT_ROOT_ENTITY)
.list()
.findAll {
it.indications.id.containsAll(ids)
}

由于查询有可能返回重复的 Url实例,因此 ResultTransformer设置为返回唯一列表。

最后, findAll()containsAll()一起使用以进一步过滤列表。

使用eqAll(也许)

类似以下内容可能会起作用。 Grails的HibernateCriteriaBuilder发生了一些奇怪的事情,该问题导致eqAll方法在根实体中查找属性。完全忽略了子条件。因此以下代码直接使用了Hibernate。它对我不起作用,但它离我可能的距离很近。这让我头疼!
Url.createCriteria().buildCriteria {}
.createCriteria('indications', 'i')
.add(org.hibernate.criterion.Property.forName('i.id').eqAll(org.hibernate.criterion.DetachedCriteria.forClass(UrlIndication)
.add(org.hibernate.criterion.Restrictions.in('id', ids))
.setProjection(org.hibernate.criterion.Property.forName('id'))
))
.setResultTransformer(org.hibernate.Criteria.DISTINCT_ROOT_ENTITY)
.list()

我遇到的问题是我无法使 Restrictions.in工作。 Restrictions.eq正常工作。

关于grails - 一对多关系的Grails准则动态AND条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32626229/

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