4

考虑 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* 不能处理两个以上的条件吗?解决方案/解决方法?

4

2 回答 2

11

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

或者用简单的英语...

  • 很明显是什么findAllByYearAndMonthAndDay(1999,2,3)意思
  • 什么findAllByYearOrMonthOrDay(1999,2,3)意思也很明显
  • 但不清楚是什么findAllByYearOrMonthAndDay(1999,2,3)意思

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

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

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

于 2009-06-24T04:11:06.020 回答
4

不,目前没有。目前仅限于2个条件。对于超过 2 的情况,请查看标准构建器或 findAllWhere 方法。

于 2009-06-23T04:08:48.460 回答