6

У меня было поле LocalTime (с использованием Joda Time) в классе домена Grails.Deserialize joda время от строки в grails?

Class WorkDone{ 
    LocalTime duration 
} 

Теперь я изменил это поле в строку (с текстом ограничения), так что он может поддерживать продолжительность больше, чем 24 часа.

String duration 

Проблема в том, что в базе данных уже есть некоторые данные. И я хочу дезинформировать эти данные через миграцию баз данных в Grails. Я использую Postgres, который сохраняет LocalTime как Bytea (двоичные данные).

Когда я звоню WorkDone.duration он возвращает мне строку вида:

\ xaced0005737200176f72672e6a6f64612e74696d652e4c6f63616c54696d65fffff44abbf29def0200024a000c694c6f63616c4d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000000000000000737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae30300007870770500035554437878

Как я могу извлечь время из этой строки?

+0

Вы пытались держать поле МестноеВремя и использовать [Joda Time Grails Plugin] (http://gpc.github.io/grails-joda-time/ руководство/persistence.html)? Также почему вы используете 'LocalTime' вместо' Duration' для постоянной продолжительности? – musketyr

+0

Вы пробовали что-то вроде: def str = "" as byte[]; def os = new ObjectInputStream(new ByteArrayInputStream(str)); LocalTime.Property.readObject(os); Raphael

+0

Нет, я не пробовал это. Попробуем и посмотрим. –

ответ

1

Вы должны были выполнить миграцию данных перед изменением типа данных на строку.

Вот что вам следует делать. 1. Измените тип данных поля на LocalTime. 2. Создайте новое поле со строкой Date. 3. Напишите сценарий, который будет получать всю дату в LocalTime и преобразовать его в String и сохранить в новом поле. 4. После переноса данных удалите старое поле и затем переименуйте новое поле в продолжительность.

+0

Да, позже я сделал это только. Хотел посмотреть, есть ли другой способ. В любом случае спасибо. –

4

Ваши данные scaped в BYTEA формате Hex (начинается с \ х) посмотрим на PostgreSQL Docs

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

Вы должны экранирования в его перед читать ObjectInputStream анг получить объект МестноеВремя, экранирования в он, а затем повторите попытку, как предлагает Рафаэль.

+1

Из java, String data = "\\ xaced0005737200176f72672e6 ...."; байт преобразован [] = PGbytea.toBytes (data.getBytes()); ByteArrayInputStream in = new ByteArrayInputStream (преобразованный); System.out.println (новый String (преобразованный)); – vzamanillo

+0

Спасибо за ответ –

+0

Добро пожаловать :-) – vzamanillo

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 ]) 
      } 
     } 
Смежные вопросы