gorm finder的奇怪行为

时间:2012-12-07 09:17:00

标签: grails gorm

在控制器中我有这个查找器

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(空)

更奇怪......

如果我在groovy控制台中运行此代码:

import myapp.User
User.findByEmail(null)

它返回一个具有空电子邮件的用户,但如果我再次运行相同的代码则返回

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

3 个答案:

答案 0 :(得分:4)

您无法使用标准findBySomething动态查找器来搜索空值,而是需要使用findBySomethingIsNull版本。尝试

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

请注意,即使User.findByEmail(null)每次都正常工作,也不一定能在所有数据库上为您提供正确的结果,因为findBySomething(null)会转换为

WHERE something = null

在底层SQL查询中,根据SQL规范null不等于其他任何内容(甚至不是null)。您必须在SQL中使用something is null来匹配空值,这是findBySomethingIsNull()转换为的值。

您可以在User类中编写静态实用程序方法,将此检查集中到一个地方

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

然后在控制器中使用User.byOptEmail(session.email)

答案 1 :(得分:1)

来自grails nabble论坛的Jeff Brown已经确定了我的问题。这是一个GORM错误。 see jira

有关此thread

的更多信息

jira

答案 2 :(得分:0)

我尝试使用调试器,看起来它应该正常工作,就像你写的那样。也许groovy本身在这里有点混乱,试着用这种方式帮助它:

User.findByEmail( session['email'] )