gpt4 book ai didi

grails - gorm finder 的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 13:49:14 25 4
gpt4 key购买 nike

在 Controller 中我有这个取景器

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

并且有效。

即使我写也能工作

User.findByEmail(null)

但是如果我写

User.findByEmail(session.email)

并且 session.email 未定义(ergo 为空)它抛出异常

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)

它返回一个电子邮件为空的用户,但如果我第二次运行相同的代码,它会返回

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

最佳答案

您不能使用标准的 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 来匹配 null 值,这就是 findBySomethingIsNull() 转换成的内容。

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

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

然后在您的 Controller 中使用 User.byOptEmail(session.email)

关于grails - gorm finder 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com