获取行时的 grails 验证

Posted

技术标签:

【中文标题】获取行时的 grails 验证【英文标题】:grails validation when fetching rows 【发布时间】:2014-04-28 00:24:23 【问题描述】:

如果列为空,是否可以在 grails 中获取默认值?如果我要通过 grails 域对象表示以下查询,那么我该如何实现它:

SELECT IFNULL(empsalary,0.00) from Employee;

域对象:

class Employee
   Integer id,
   Float empsalary

   static constraints = 
      id unique: true, blank:false
      empsalary nullable:true
   

由于现有数据,无法将 empsalary 设为 null 为 false empsalary 上的验证器似乎在插入行时有效,但在数据提取时无效 我们可以考虑在域上编写 getEmpSalary() 方法并在那里执行检查,但还有其他几个字段我们需要这样做,因此尽量避免大量代码更改

【问题讨论】:

【参考方案1】:

如果您希望从数据库中获取默认值而无需将任何内容编码到您的类中,我建议您更新它为空的每一行并将其设置为数据库中的 0。如果从另一个应用程序插入数据并且该应用程序允许空值,请在您的数据库列上放置一个“DEFAULT 0”。

Grails 还提供了一个“afterLoad”事件,该事件在从数据库加载域对象时运行。请参阅此处的文档:http://grails.org/doc/2.3.7/guide/GORM.html

【讨论】:

这不是一个新对象。该对象是使用 db 中的值创建的,因此大多数字段都有值,有些字段为空。显然验证器在获取行时没有运行。 Employee.read(id) 不会触发验证器。 afterLoad 成功了。 onLoad 实际上是 beforeLoad 被 db 值覆盖。接受答案。 感谢 Mayank - 很高兴我引导您朝着正确的方向前进。我更新了 afterLoad 的答案,让读者更清楚。【参考方案2】:

我认为你可以用 HQL 做到这一点:

def salary = Employee.executeQuery('SELECT COALESCE(empsalary, 0.0) FROM Employee')[0]

见this SO Question。

【讨论】:

它已经是域对象,而不是特定的查询。我只是以查询为例来阐明我想要实现的目标。【参考方案3】:

请尝试在您的域对象中设置Float empsalary = 0.0

【讨论】:

已经有了。似乎不起作用。圣杯2.2.2。通过 Employee.read(id) 读取数据 那只会在实例化一个新对象时设置一个默认值。

以上是关于获取行时的 grails 验证的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Grails 之外使用 Grails 验证?如何?

Grails 客户端验证

Grails,Field 的域类默认值

在 Grails Spring 应用程序中获取 LDAP 属性 memberof

Grails 覆盖默认的电子邮件验证

参数化 Grails 验证消息