在 Grails 域类中设置日期字段的默认值

Posted

技术标签:

【中文标题】在 Grails 域类中设置日期字段的默认值【英文标题】:Setting default value for Date field in Grails Domain Class 【发布时间】:2013-12-10 17:56:28 【问题描述】:

我正在尝试为 Domain 类中的 Date 字段设置默认值。

我可以在mapping 配置中使用defaultValue,但它不适用于Date 字段(我已经在StringInteger 上尝试过,效果很好)。

这是一个例子:

class Something 

    Date myField

    static mapping = 
        myField defaultValue: new Date()
    


此代码失败,因为 Hibernate 生成的 CREATE 语句不正确。是这样的:

... my_field datetime default Mon Nov 25 17:59:08 UYST 2013 not null ...

【问题讨论】:

【参考方案1】:

您始终可以在静态初始化程序中初始化字段或在构造函数中设置值:

class Something 
    // initializer
    Date myField = new Date()

    // or in the ctor
    Something() 
        myField = new Date()
    

这不会在数据库模式中设置默认值,它只是在创建实例时设置字段的值。如果您希望架构具有默认值,则可以使用“defaultValue”映射条目,如下所示:

class Something 
    Date myField

    static mapping = 
        myField defaultValue: "now()"
    

您为默认值设置的值取决于您的数据库供应商。 (注意使用 sql now() 方法而不是 Java/Groovy new Date()

【讨论】:

谢谢!我认为这是解决方案,但不想要像 now() 那样的数据库引擎特定功能【参考方案2】:

GORM 可以轻松满足最基本的Date 用例;创建和更新。

只需将关键字dateCreatedlastUpdated 包含在域的属性中,默认 功能就会发生。

警告:如果他们的约束是nullable: false,这将导致失败。要么删除这些约束,要么将 autoTimestamp 设置为 false。

例如:

class MyDomain 
   Date dateCreated
   Date lastUpdated
   Date yesterday = new Date().previous()
   Date weekAgo = new Date() - 7
   Date monthAgo = new Date() - 30
   Date usaIndepenceDay = new Date().copyWith(
         year: 1776, 
         month: Calendar.JULY, 
         dayOfMonth: 4, 
         hourOfDay: 0,
         minute: 0,
         second: 0)

   static mapping = 
     //autoTimestamp false
   

   static constraints = 
     //dateCreated nullable: false
   

在this SO answer、groovy date api 和 GORM 的日期事件功能here 上阅读更多关于常规日期的信息

【讨论】:

谢谢,我已经知道 dateCreated 和 lastUpdated 字段,但这些与我原来的问题无关:D 我松散地将它们扔在那里,因为我在 grails 日期上找不到好的快速答案,并添加了一些易于消化的内容 如何将默认日期设置为明天的日期?或者说四天后?【参考方案3】:

您可以将其用于从系统日期自动获取的默认装箱日期

class User 
String userName
String firstName
String lastName
Date createdDate = new Date() // set system date


static mapping = 
    version false
    id generator: 'increment'
    cache true


static constraints = 
    userName(unique: true)


【讨论】:

以上是关于在 Grails 域类中设置日期字段的默认值的主要内容,如果未能解决你的问题,请参考以下文章

Grails,Field 的域类默认值

如何在 Grails 域类中正确设置属性值

如何使用用户定义的函数为 grails 中的域类变量设置默认值

怎么在mysql的字段中设置默认值

在 Twig 中设置 Symfony 2 表单字段的默认值

如何在liquibase中设置当月第一个日期和下个月的默认值?