2

コントローラーには、このファインダーがあります

User.findByEmail('test@test.com')

そして動作します。

書いても動く

User.findByEmail(null)

しかし、私が書くなら

User.findByEmail(session.email)

session.email が定義されていない (ergo が null) 場合、例外がスローされます

groovy.lang.MissingMethodException: No signature of method: myapp.User.findByEmail() is applicable for argument types: () values: []

この振る舞いは正しいですか?

「session.email」を評価するとnullになるので、 User.findByEmail(null) と書いたときと同じように動作するはずだと思います

さらに奇妙な……。

このコードを Groovy コンソールで実行すると、次のようになります。

import myapp.User
User.findByEmail(null)

メールがnullのユーザーを返しますが、同じコードを2回実行すると返されます

groovy.lang.MissingMethodException: No signature of method: myapp.User.findByEmail() is applicable for argument types: () values: []
4

3 に答える 3

4

findBySomething標準の動的ファインダーを使用して null 値を検索することはできませんfindBySomethingIsNull。代わりにバージョンを使用する必要があります。試す

def user = (session.email ? User.findByEmail(session.email)
                          : User.findByEmailIsNull())

User.findByEmail(null)毎回正しく機能したとしても、すべてのデータベースで正しい結果が得られるとは限らないことに注意してくださいfindBySomething(null)

WHERE something = null

基になる SQL クエリで、SQL 仕様によれば、nullは他のものと等しくありません ( でさえありませんnull)。something is nullnull 値と一致させるには、SQL で使用する必要があります。これは、findBySomethingIsNull()変換されるものです。

クラスに静的ユーティリティ メソッドを記述して、Userこのチェックを 1 か所にまとめることができます。

public static User byOptEmail(val) {
  if(val == null) {
    return User.findByEmailIsNull()
  }
  User.findByEmail(val)
}

次にUser.byOptEmail(session.email)、コントローラーで使用します。

于 2012-12-07T12:25:14.717 に答える
1

grails nabble フォーラムの Jeff Brown が私の問題を特定しました。これはGORMのバグです。ジラを見る

このスレッドの詳細

このジラ

于 2012-12-07T15:55:21.853 に答える
0

私はデバッガーを試してみましたが、あなたが書いているように、それは機能しているはずです。たぶん、グルーヴィー自体はここで少し混乱しています、このようにそれを助けてみてください:

User.findByEmail( session['email'] )
于 2012-12-07T10:18:09.973 に答える