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()}"

これらの動的ファインダーの使用法の最初の 5 つは、期待どおりに機能します。

ただし、6 番目のものは InvalidPropertyException (「クラス [class foo] の名前 [yearAndMonth] のプロパティが見つかりません」) で失敗します。

質問:

6番目のものが機能しないのはなぜですか? findAllBy* は 2 つ以上の条件を処理できませんか? 解決策/回避策は?

4

2 に答える 2

11

Ted の答えは正しいですが、Grails が 2 つ以上の述語をサポートしていない理由、すべての接続詞が同じでない場合、意図が明確でないためです。

それとも平易な英語で...

  • findAllByYearAndMonthAndDay(1999,2,3)何を意味するかは明らかだ
  • findAllByYearOrMonthOrDay(1999,2,3)意味もわかりやすい
  • findAllByYearOrMonthAndDay(1999,2,3)しかし、意味は明らかではありません

ただし、すべての接続詞同じ (すべてands またはすべてors) の場合、3 つ以上の述語をサポートできない理由はありません。実際、Grails JIRA を検索すると、これに関する未解決の問題が既に存在することがわかります。あなたがそれについて強く思うなら、それに投票してください。

ちなみに、IntelliJ Grails プラグインは、2 つ以上の述語を持つ動的ファインダーのコード補完を誤って提供します。

解決策/回避策は、単純に Criteria クエリを記述するか、代わりに HQL を使用することです。

于 2009-06-24T04:11:06.020 に答える
4

いいえ、現在はありません。現在、2つの条件に制限されています。2つ以上については、基準ビルダーまたはfindAllWhereメソッドを参照してください。

于 2009-06-23T04:08:48.460 に答える