在控制器中我有这个查找器
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: []
答案 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)
答案 2 :(得分:0)
我尝试使用调试器,看起来它应该正常工作,就像你写的那样。也许groovy本身在这里有点混乱,试着用这种方式帮助它:
User.findByEmail( session['email'] )