2011-04-03 79 views
11

我在Grails的createCriteria中看到一些意外的行为。我有一个像这样的域类:Grails createCriteria:通过为空域类实例的字段查找对象

MyDomainClass { 
    AnotherDomainClass anotherDomainClass 
    static constraints = { 
     anotherDomainClass(nullable:true) 
    } 
} 

我想查找其中anotherDomainClass为null的所有MyDomainClass实例。所以我这样做:

return MyDomainClass.createCriteria().list { 
    eq('anotherDomainClass', null) 
} 

但是,我没有得到任何回报。

我在做什么错?我可以看到有数据库条目的ANOTHERDOMAINCLASS_ID列的确是空的(或空白,我不知道)。

我会很好创建一个查询,直接引用ANOTHERDOMAINCLASS_ID列,但我还没有找到方法。

谢谢!

回答

15

而不是使用情商,你可以使用ISNULL

def results = MyDomainClass.withCriteria { 
    isNull('anotherDomainClass') 
} 

的这里有一个很好的参考HibernateCriteriaBuilder Javadoc了。

+0

谢谢,这工作!接受这一个,因为它是第一个,并提供示例代码和一个链接到javadocs。 – 2011-04-03 22:59:53

+1

谢谢。这是另一个很好的参考(http://grails.org/doc/latest/ref/Domain%20Classes/createCriteria.html) – 2011-04-03 23:23:15

+1

如果您不必检查条件中的其他条件,也可以使用动态查找器,所以你可以做def results = MyDomainClass.findAllByAnotherDomainClassIsNull():-) – Maricel 2011-04-03 23:27:31

1

这不是一个真正的答案,但我暂时的解决方法是检索应用层所有的从数据库中和过滤的对象,像这样:

MyDomainClass.list({it.anotherDomainClass == null}) 
2

如果您尝试,会发生什么isNull而不是eq

编辑:其实可以是isEmpty而不是isNull

相关问题