1

我从顾问那里继承了一个应用程序,并试图遵循通过两个参数从数据库中找到用户的代码 - 提供者和标识符。

据我所知,有一个控制器方法,该方法又调用一个服务方法,该服务方法调用似乎是域类中名为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 创建了一个带有 where 子句的 select 语句,该子句采用提供者 id 和正在验证的标识符值。

如果您想查看生成的查询,您可以打开 Hibernate SQL 日志记录,或设置log4jdbc

于 2013-06-28T14:57:52.690 回答