Grails结合" in"和#34; isEmpty"内部和或忽略" isEmpty"

时间:2015-03-17 12:18:28

标签: hibernate grails

我希望能够编写一个标准,允许我搜索具有特定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部分过滤条件进一步提升。 有人可以帮忙吗? 的问候,

2 个答案:

答案 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)
  }
}