我正在尝试运行“where”查询以查找与其他域模型对象无关的域模型对象,或者如果是,则该域模型对象具有特定的属性值。这是我的代码:
query = Model.where({
other == null || other.something == value
})
def list = query.list()
但是,结果列表仅包含与OR语句的第二部分匹配的对象。它不包含与“other == null”部分匹配的结果。我的猜测是,因为它正在检查关联对象中的值,所以它强制它仅检查实际具有此关联对象的条目。如果是这种情况,我该如何创建此查询并实际使其正常工作?
答案 0 :(得分:5)
您必须使用LEFT JOIN才能查找空关联。默认情况下,Grails使用内部联接,不会为null结果加入。使用下面的withCriteria
,您应该得到预期的结果:
import org.hibernate.criterion.CriteriaSpecification
def results = Model.withCriteria {
other(CriteriaSpecification.LEFT_JOIN){
or{
isNull 'id'
eq 'something', value
}
}
}
<强>更新强>
我知道DetachedCritieria中的别名是不可能的,人们会尝试在createCriteria/withCriteria
中指定连接。有一个existing defect regarding adding the functionality to DetachedCriteria。只需为缺陷中提到的查询添加解决方法。
Model.where {
other {
id == null || something == value
}
}.withPopulatedQuery(null, null){ query ->
query.@criteria.subcriteriaList[0].joinType = CriteriaSpecification.LEFT_JOIN
query.list()
}
我宁愿使用withCriteria
代替above hack。
答案 1 :(得分:0)
这可能有效:
query = Model.where({
isNull( other ) || other.something == value
})
如果这不起作用,请尝试以下方法:
other.id == null || other.something == value
更新:
或使用good'ol条件查询:
list = Pack.withCriteria{
or{
isNull 'other'
other{ eq 'something', value }
}
}