从grails中的字符串反序列化joda时间?

时间:2013-11-22 21:14:43

标签: grails groovy deserialization jodatime grails-domain-class

我在Grails域类中有一个LocalTime字段(使用Joda Time)。

Class WorkDone{
    LocalTime duration
}

现在我已将此字段更改为String(具有Text约束),以便它可以支持大于24小时的持续时间。

String duration

问题是数据库中已经存在一些数据。我想通过Grails中的数据库迁移来清理这些数据。我正在使用Postgres将LocalTime保存为 Bytea (二进制数据)。

当我调用WorkDone.duration时,它返回一个表格形式的字符串:

\ xaced0005737200176f72672e6a6f64612e74696d652e4c6f63616c54696d65fffff44abbf29def0200024a000c694c6f63616c4d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000000000000000737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae30300007870770500035554437878

如何从此字符串中提取时间?

3 个答案:

答案 0 :(得分:4)

您的数据以bytea Hex格式显示,(以\ x开头)查看PostgreSQL文档

http://www.postgresql.org/docs/current/static/datatype-binary.html

你必须在读取之前将其取消为ObjectInputStream,然后获取LocalTime对象,对其进行unescape,然后再按照Raphael的建议再试一次。

答案 1 :(得分:1)

在将Data-type更改为String之前,您应该已完成数据迁移。

这是你应该做的。 1.将字段的数据类型更改回LocalTime。 2.使用字符串日期创建一个新字段。 3.编写一个脚本,该脚本将在LocalTime中获取所有日期并将其转换为String并将其保存在新字段中。 4.迁移数据后,删除旧字段,然后将新字段重命名为duration。

答案 2 :(得分:1)

我最终做了以下事情 -

grailsChange{
        change{
            sql.eachRow("Select id,duration from work_done"){
                def wdId =  it.id
                def durationObj = (LocalTime)(new ObjectInputStream(new ByteArrayInputStream(it.duration))).readObject()

                durationObj = durationObj.toString().substring(0,8)

                WorkDone.executeUpdate("update WorkDone wd set wd.duration=:newDuration" +
                    "where wd.id=:wdId",
                    [newDuration:durationObj ,wdId:wdId ])
            }
        }