gpt4 book ai didi

grails - 过滤多个关联和可选的 where 子句

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

我有几个域类,它们之间有一些简单的关联,如下所示:

class Business {
String name
City city
Industry industry
}

class City {
String name
}

class Industry {
String name
}

在我的应用程序中,我想要一个“过滤器”,可以根据城市和行业过滤所有企业的列表。我可以将过滤器中的城市和行业 ID 返回到业务 Controller ,但是,当我到达 Controller 进行过滤时,我有以下代码:
...
def industry = Industry.get(params.int('industryid'))
def city = City.get(params.int('cityid'))

def businessList = Business.findAllByIndustryAndCity(industry, city)
...

当 City 和 Industry 字段都有值时,此代码有效。但是,有时用户可能只想按城市或行业进行过滤,而不是两者。在这种情况下,过滤器会失败,因为当任何一个值为 null 时,都不会返回任何结果。我怎么能指定如果任何一个关联值为“null”,那么“find”查询应该完全删除这个约束?即匹配该字段的“全部”

请注意,我意识到很容易放置一个 if 语句来检查值是否为空,然后基于它执行不同的“查找”语句。然而,虽然这适用于两个值,但我认为随着更多可过滤值的添加,它不会很好地扩展。

最佳答案

您可以建立标准。

def c = Business.createCriteria()
def results = c.list{
and {
if (industry) {
eq("industry", industry)
}
if (city) {
eq("city", city)
}
}
}

检查引用 here在 grails 文档中。

但是,您的代码需要对 N 个参数进行 N+1 次查询。也许您可以使用标准的想法将其减少为一个查询?如果您的 Business实体持有两个 Industry 的外键和 City这个应该工作:
def c = Business.createCriteria()
def results = c.list{
and {
if (params.industryid) {
eq("industry_id", params.industryId as Long)
}
if (params.cityid) {
eq("city_id", params.cityid as Long)
}
}
}

这两个示例都未经测试,但您应该明白这一点。

关于grails - 过滤多个关联和可选的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9838676/

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