1

コンサルタントからアプリを継承し、Provider と Identifier の 2 つのパラメーターを介してデータベースからユーザーを検索するコードをたどろうとしています。

私が収集したものから、サービス メソッドを呼び出すコントローラー メソッドがあり、そのサービス メソッドはLoginと呼ばれるドメイン クラスのバリデーターのように見えるものを呼び出します。

ここで行き止まりになったような気がします。Login.findByProviderAndIdentifier()の実際のコードはどこにありますか?

class Login {
  String id
  String identifier
  String password
  boolean generated = false
  Provider provider
    Date lastUpdated
    Date dateCreated
    Boolean isActive = true

    static constraints = {
        identifier(blank:false,
                   validator: {val, obj, errs ->
                       if (val && obj.provider && !obj.generated) {
                           def dbLogin = Login.findByProviderAndIdentifier(obj.provider, val)
                           if (dbLogin && dbLogin.id != obj.id) {
                               errs.rejectValue("identifier", "unique", [obj.provider.name, obj.identifier] as Object[], "Identifier ${obj.identifier} already exists for provider ${obj.provider.name}")
                           }
                       }
                   }
               }
4

1 に答える 1

2

このメソッドは動的ファインダーです。そのための「実際のコード」は、GORM によってオンザフライで生成されます。ドキュメントがそれを説明する方法は次のとおりです。

GORM は、動的ファインダーの概念をサポートしています。動的ファインダーは静的メソッド呼び出しのように見えますが、メソッド自体は実際にはコード レベルでどのような形でも存在しません。

代わりに、特定のクラスのプロパティに基づいて、実行時にコード合成を使用してメソッドが自動的に生成されます。

したがって、この場合、GORM はプロバイダー ID と検証される識別子の値を受け取る where 句を含む select ステートメントを作成します。

生成されたクエリを確認したい場合は、Hibernate SQL ロギングを有効にするか、log4jdbcをセットアップします。

于 2013-06-28T14:57:52.690 に答える