考虑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 *能够处理两个以上的条件?溶液/变通?
答案 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方法。