0

我今天在我们的 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 )都会找到与对象 B 插入时具有相同 ID 的DomainObject 。

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

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

我还想指出,DomainObject.get(null)不会遭受这个问题。

其他人见证了这一点吗?

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

4

2 回答 2

0

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

我希望这会有所帮助。

于 2014-11-18T05:06:18.977 回答
0

谢谢你的信息苏格兰人。

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

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

于 2014-11-24T15:51:53.670 回答