我希望能够编写一个标准,允许我搜索具有特定DevelopmentOfInterest(hasMany)或根本没有的所有潜在客户。
我的域名模型如下所示:
Lead {
Set<Development> developmentsOfInterest
static hasMany = [
developmentsOfInterest:Development
]
}
如果我根据开发列表搜索特定列表,我可以在我的标准中使用以下内容:
developmentsOfInterest{
'in'("id", developments*.id)
}
要找到所有没有任何发展的人,我会使用isEmpty
isEmpty("developmentsOfInterest")
所以逻辑告诉我,如果我将这两个放在一个OR中,我会得到组合列表..
or{
isEmpty("developmentsOfInterest")
developmentsOfInterest {
'in'("id", developments*.id)
}
}
它不会..它只会返回感兴趣的列表(基本上忽略“isEmpty”)
sql 生成如下
where (this_.account_id=? and (not exists (select 1 from lead_development where this_.id=lead_developments_of_interest_id) or (developmen1_.id in (?, ?))))
但我认为这将是正确的sql命令?它读得正确:
(not exists (select 1 from lead_development where this_.id=lead_developments_of_interest_id) or (developmen1_.id in (?, ?))
更新: 我比较了isEmpty()或sizeEq()生成的SQL和“in”,而“in”则添加了一大堆带有连接的额外查询代码。 我猜测连接是不正确的,这导致isEmpty不起作用(因为它只显示与developmentOfInterests连接的项目)
where (this_.account_id=? and (? = (select count(*) from lead_development where this_.id=lead_developments_of_interest_id) or this_.id in (?))) order by lower(this_1_.first_name) asc limit ?
Account_id部分过滤条件进一步提升。 有人可以帮忙吗? 的问候,
答案 0 :(得分:0)
您可以按照以下标准设置:
or{
sizeEq 'developmentsOfInterest', 0
'in' 'developmentsOfInterest', developments
}
答案 1 :(得分:0)
我知道这是一个非常老的问题,但是最近我遇到了同一问题,我认为问题是grails将默认为内部联接,从而导致isEmpty被忽略
对我有用的是显式指定联接类型。
例如:
Lead.createCriteria().listDistinct {
createAlias('developmentsOfInterest', 'developmentsOfInterestJoin', JoinType.LEFT_OUTER_JOIN)
or {
isEmpty('developmentsOfInterest')
inList('developmentsOfInterestJoin.id', developments)
}
}