为什么在Grails / GORM中使用三个条件时findAllBy *会失败?

时间:2009-06-22 10:28:40

标签: grails groovy gorm

考虑Grails / GORM动态查找器方法的以下用法:findAllBy *:

def foo1 = Foo.findAllByYear(yyyy)
def foo2 = Foo.findAllByMonth(mm)
def foo3 = Foo.findAllByDay(dd)
def foo4 = Foo.findAllByYearAndMonth(yyyy, mm)
def foo5 = Foo.findAllByYearAndDay(yyyy, dd)
def foo6 = Foo.findAllByYearAndMonthAndDay(yyyy, mm, dd)

println "# foo1=${foo1.size()} foo2=${foo2.size()} foo3=${foo3.size()}"
println "# foo4=${foo4.size()} foo5=${foo5.size()} foo6=${foo6.size()}"

这些动态查找器使用中的前五个按预期工作。

但是,第六个失败的是InvalidPropertyException(“为类[class foo]”找不到名称[yearAndMonth]的属性)。

问题:

为什么第六个不起作用?是不是findAllBy *能够处理两个以上的条件?溶液/变通?

2 个答案:

答案 0 :(得分:11)

Ted的答案是正确的,但为什么 Grails不支持超过2个谓词的原因是因为如果所有连词都不相同则不清楚意图是什么。

或者用简单的英语......

  • 很明显findAllByYearAndMonthAndDay(1999,2,3)的含义
  • findAllByYearOrMonthOrDay(1999,2,3)意味着什么
  • 也很明显
  • findAllByYearOrMonthAndDay(1999,2,3)的含义并不明显

但是,如果所有连词 相同(所有and s或所有or s),则没有理由不能超过2个谓词支持的。事实上,如果你搜索Grails JIRA,你会发现这已经是一个未解决的问题。如果您对此有强烈的兴趣,请投票支持。

顺便提一下,IntelliJ Grails插件错误地为具有2个以上谓词的动态查找器提供代码完成。

解决方案/解决方法是简单地编写Criteria查询或改为使用HQL。

答案 1 :(得分:4)

不,不是。目前仅限于2个条件。有关2个以上,请查看条件构建器或findAllWhere方法。