我今天在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但它并没有真正描述这个问题。
答案 0 :(得分:0)
我们并不支持将null作为参数传递给动态查找器。动态查找器明确支持null查询。您可以拨打DomainClass.findByName(null)
而不是DomainClass.findByNameIsNull()
。如果您的引用可能为null,也可能不为null,而不是将其作为参数传递给动态查找程序,通过编写条件查询或具有条件的“where”查询,代码几乎总能变得更干净
我希望有所帮助。
答案 1 :(得分:0)
感谢你的信息。
我有进一步的细节。底层数据库也会更改此行为。 虽然mysql受此影响,但maria-db(一个mysql克隆)却没有!
所以会发生什么与底层数据库系统绑定。 这不应该发生在抽象层......