【问题标题】:Grails findById( null ) returning "random" resultGrails findById(null) 返回“随机”结果
【发布时间】:2015-01-14 11:15:23
【问题描述】:

我今天在我们的 grails 应用程序中发现了一个非常奇怪的行为,我想与您分享。

我们在 mysql 5.1.48 上使用 grails 2.3.11。

我们在您的一个控制器操作中有一个DomainObject.findById( id )。 我们未能检查 id 的空值所以DomainObject.findById( null ) 当没有 id 作为参数传递时将被调用。

通常DomainObject.findById( null ) 将返回 null 但有一个特殊条件会产生其他结果!

如果之前调用的控制器操作在数据库中插入了一条新记录(我们称之为对象 B),无论存储的域对象如何,DomainObject.findById( null ) 都会找到具有相同的 DomainObject对象 B 是否已插入。

因此,当在保存任何内容之前调用的控制器操作时,findById(null) 将返回一行。并且该行将具有与最后插入的元素相同的 id。

我完全知道使用findById(null) 不是理想的方法,但我对它产生的结果感到非常震惊。但是返回任何看似“随机”的结果对我来说似乎很奇怪。

我还要注意DomainObject.get(null) 不会遇到这个问题。

其他人目睹了这一点吗?

有一个活跃的 Jira 指向这个方向:https://jira.grails.org/browse/GRAILS-9628,但它并没有真正描述这个问题。

【问题讨论】:

    标签: grails null grails-orm dynamic-finders


    【解决方案1】:

    我们并不真正支持将 null 作为参数传递给这样的动态查找器。动态查找器明确支持按 null 进行查询。您可以调用DomainClass.findByNameIsNull(),而不是DomainClass.findByName(null)。如果您的引用可能为空,也可能不为空,而不是将其作为参数传递给动态查找器,几乎总是可以通过编写条件查询或其中包含条件的“where”查询来使代码更清晰.

    希望对你有帮助。

    【讨论】:

    • 当我看到这个问题并在我的一个应用程序中进行测试时,查询已“正确”以id is null 发送到数据库 - 我同意最好明确并在代码中测试 null ,但是为什么 GORM 有时会处理这个问题而有时却不处理呢?它取决于特定的数据库驱动程序吗? Hibernate/GORM 版本?
    • ty 用于观察。我知道这部分是我的错,我只是对结果感到困惑。我想将 findByXXX( null ) 处理为 findByXXXIsNull 应该不会太难,因为这就是人们期望发生的事情。我还没有时间用不同的数据库对其进行测试,但我可以确认当我们使用 maria-db 将应用程序部署到服务器时没有发生相同的错误。可能跟开发环境有关。
    • @Oliver 您有问题还是“其他人目睹了这一切?”真的吗?
    • 您说得对,我创建此页面的主要原因是分享我的担忧。我想知道是否应该建议使用动态查找器,考虑到它们对空值的限制。
    • @Oliver "...我创建这个页面是为了分享我的担忧。" - groups.google.com/forum/#!forum/grails-dev-discuss 是一个更好的分享问题的论坛。 StackOverflow 真的是用来提问的。 “我想知道是否应该建议使用动态查找器......”的答案当然是“是”。对于某些查询,它们易于阅读、易于编写且极具表现力。在可以使事情变得更好的地方使用它们,在它们不能使事情变得更好的地方,不要使用它们。
    【解决方案2】:

    谢谢你的信息。

    我有更多细节。底层数据库也会更改此行为。 虽然 mysql 有这个问题,但 maria-db(一个 mysql 克隆)却没有!

    所以发生的事情与底层数据库系统有关。 这不应该发生在抽象层上......

    【讨论】:

    • 这应该是对问题的编辑。应为提出的解决方案保留发布答案。
    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2021-10-30
    相关资源
    最近更新 更多