Grails - 从 if 和 else 中使用 null 属性创建条件

标签 grails if-statement nullable multiple-domains createcriteria

我正在使用 Grails 2.3.4。我正在尝试检索具有特定条件的域对象,但是当属性为空时我很难绕过。这是一个例子。

class Domain1 {
   int locationId
   Domain2 domain2
   Domain3 domain3
   ...
   static constraints = {
      locationId(nullable:false, blank:false, unique:false)
      domain2(nullable:true)
      domain3(nullable:true)
      ...
   }
}

class Domain2 {
   int locationId
   ...
   static constraints = {
      locationId(nullable:false, blank:false, unique:false)
      ...
   }
}

class Domain3 {
   int locationId
   ...
   static constraints = {
      locationId(nullable:false, blank:false, unique:false)
      ...
   }
}

如果locationId在Domain1中有效,并且locationId在Domain2中有效(如果不为null),并且locationId在Domain3中有效(如果不为null),则查询仅假设返回单个Domain1。

def getDomain1ById(Long sid) {
   return Domain1.createCriteria().get {
      idEq(sid)
      'in' ("locationId", Util.getUserAccessLocationList())
      // What I want to do is if(domain2 != null) check location
      or {
         isNull("domain2")
         domain2 {
            'in' ("locationId", Util.getUserAccessLocationList())
         }
      }
      // What I want to do is if(domain3 != null) check location
      or {
         isNull("domain3")
         domain3 {
            'in' ("locationId", Util.getUserAccessLocationList())
        }
      }
   }
}

我错过了什么。如果domain2和domain3不为空,则查询工作正常

最佳答案

默认情况下,Grails 条件查询使用内部联接。要实现您想要的条件行为,请更改为左连接:

Domain1.createCriteria().get {
    createAlias('domain2', 'd2', CriteriaSpecification.LEFT_JOIN)
    createAlias('domain3', 'd3', CriteriaSpecification.LEFT_JOIN)
    idEq(sid)
    'in' ("locationId", locIds)
    or {
        isNull("domain2")
        'in' ("d2.locationId", locIds)
    }
    or {
       isNull("domain3")
       'in' ("d3.locationId", locIds)
    }
}

关于Grails - 从 if 和 else 中使用 null 属性创建条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27847398/

相关文章:

Grails UrlMappings 用于未知数量的变量

grails - 如何指示Grails始终创建以斜杠(/)结尾的URL:s?

grails - 在 Grails 3.0.9 中向 src/groovy 注入(inject)服务

arrays - 根据应用于另一个向量的条件创建向量

C# 处理空值

c# - "ulong == ulong?"评估为 "ulong == ulong"工作正常

c# - 可为空,检查默认值

Grails 过滤器语法,或者,如何在 Grails 之外调用 Grails 过滤器

c++ - 双输入验证 C++ 程序的问题

VB.NET 如何提供最佳性能 "Select case"或 IF... ELSEIF ... ELSE... END IF