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

kno*_*orv 4 grails groovy grails-orm

请考虑以下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()}"
Run Code Online (Sandbox Code Playgroud)

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

但是,第六个失败,出现InvalidPropertyException("为类[class foo]"找不到名称[yearAndMonth]的属性).

题:

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

Dón*_*nal 11

泰德的答案是正确的,但原因为何 Grails的不支持超过2个谓词是因为如果所有的连词是不一样,那么它没有明确的意图是什么.

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

  • 这显然findAllByYearAndMonthAndDay(1999,2,3)意味着什么
  • 这也很明显findAllByYearOrMonthOrDay(1999,2,3)意味着什么
  • 但这并不明显findAllByYearOrMonthAndDay(1999,2,3)意味着什么

但是,如果所有连词相同(全部ands或全部ors),那么就没有理由不支持超过2个谓词.事实上,如果你搜索Grails JIRA,你会发现这已经是一个未解决的问题.如果您对此感到强烈,请投票支持.

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

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