Grails - createCriteria from if and else with null 属性
Grails - createCriteria from if and else with null property
我正在使用 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中不为空,locationId在Domain3中不为空,则查询仅假设return单个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 不为 null
,则查询工作正常
默认情况下,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 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中不为空,locationId在Domain3中不为空,则查询仅假设return单个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 不为 null
,则查询工作正常默认情况下,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)
}
}