Grails findById(null)返回"随机"结果

时间:2014-11-17 14:05:14

标签: grails null gorm dynamic-finders

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

我们在mysql 5.1.48上使用grails 2.3.11。

我们在您的某个Controller操作中有DomainObject.findById( id )。 我们无法检查空值的id,因此DomainObject.findById( null ) 将没有id作为参数传递时调用。

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

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

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

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

我还想指出DomainObject.get(null)不会遇到这个问题。

还有其他人见过这个吗?

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

2 个答案:

答案 0 :(得分:0)

我们并不支持将null作为参数传递给动态查找器。动态查找器明确支持null查询。您可以拨打DomainClass.findByName(null)而不是DomainClass.findByNameIsNull()。如果您的引用可能为null,也可能不为null,而不是将其作为参数传递给动态查找程序,通过编写条件查询或具有条件的“where”查询,代码几乎总能变得更干净

我希望有所帮助。

答案 1 :(得分:0)

感谢你的信息。

我有进一步的细节。底层数据库也会更改此行为。 虽然mysql受此影响,但maria-db(一个mysql克隆)却没有!

所以会发生什么与底层数据库系统绑定。 这不应该发生在抽象层......