grails joda datetime millis没有保存在DB中?

时间:2015-09-14 09:25:57

标签: grails jodatime

我尝试根据validFrom& amp;来搜索产品的当前货币。 validUntil属性,用于在价格到期时保存信息。

当价格发生变化时,我将旧价格的validUntil属性从null(这意味着有效到无穷大)设置为Datetime,直到它有效。然后我创建一个新的价格,其中validUntil是1 !!老有效之后的毫秒,直到。这样我每个产品的价格都是有效的。

这是我的测试用例

def endDateOld = DateTime.parse('2015-09-14T10:49:00+02:00')
log.debug "a "+endDateOld.millis
def startDateNew = new DateTime(endDateOld).plusMillis(1)
log.debug "b "+startDateNew.millis

生成

a 1442220540000
b 1442220540001

当我将其保存到DB

def money = new MoneyProduct(validFrom:endDateOld, validUntil:startDateNew, amount:199)
money.save(flush:true)

我得到了我得到的值:

log.debug "from "+money.validFrom.millis+" until "+money.validUntil?.millis

输出:

from 1442220540000 until 1442220540000

MoneyProduct类:

class MoneyProduct {

    BigDecimal amount 
    Currency currency = Currency.getInstance("EUR")
    DateTime dateCreated

    DateTime validFrom
    DateTime validUntil

    static constraints = {
        validUntil(nullable:true)   
        amount(nullable:false)
    }

    static belongsTo = [product:Product]
}

可能是配置问题? Config.groovy中:

// Added by the Joda-Time plugin:
grails.gorm.default.mapping = {
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDateMidnight, class: org.joda.time.DateMidnight
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDateTime, class: org.joda.time.DateTime
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDateTimeZoneAsString, class: org.joda.time.DateTimeZone
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDurationAsString, class: org.joda.time.Duration
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentInstantAsMillisLong, class: org.joda.time.Instant
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentInterval, class: org.joda.time.Interval
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentLocalDate, class: org.joda.time.LocalDate
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime, class: org.joda.time.LocalDateTime
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentLocalTime, class: org.joda.time.LocalTime
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentPeriodAsString, class: org.joda.time.Period
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentTimeOfDay, class: org.joda.time.TimeOfDay
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentYearMonthDay, class: org.joda.time.YearMonthDay
    "user-type" type: org.jadira.usertype.dateandtime.joda.PersistentYears, class: org.joda.time.Years
}

修改

看起来joda datetime数据类型在mySQL中存储为DATETIME,只有第二个精度。我怎么能改变这个?

确定。我需要覆盖默认的hibernate映射。我试过了:

static mapping = {
    validFrom sqlType: "DATETIME", length: 3
    validUntil sqlType: "DATETIME", precision: 3
}

默认情况下,grails正在创建一个日期时间列(我使用joda插件),没有长度/精度,默认为0.这意味着没有精度=秒。在我的情况下,我需要毫秒精度,即@Adam Michalik建议的长度/精度为3(6将为纳米)

当我将长度更改为3时,手动grails更新并完美地检索毫秒。

1 个答案:

答案 0 :(得分:0)

你需要告诉mysql你想要的第二个小数的大小 - 范围是0到6.使用

DATETIME(6)

获得最大可用精度。默认情况下,它为0,所以你根本不会得到任何毫秒。

引用the documentation

  

要定义包含小数秒部分的列,请使用语法type_name(fsp),其中type_name为TIMEDATETIMETIMESTAMP,以及{{1}是小数秒精度。例如:

     

fsp

     

CREATE TABLE t1 (t TIME(3), dt DATETIME(6));值(如果给定)必须在0到6的范围内。值0表示没有小数部分。如果省略,则默认精度为0.(这与标准SQL默认值6不同,以便与以前的MySQL版本兼容。)