2013-11-22 12 views
6

Avevo un campo LocalTime (utilizzando Joda Time) nella classe di dominio Grails.Deserializzare il tempo joda dalla stringa nei graal?

Class WorkDone{ 
    LocalTime duration 
} 

Ora mi hanno alterato questo campo per String (con vincolo di testo) in modo che possa supportare durata maggiore di 24 ore.

String duration 

Il problema è che ci sono già alcuni dati nel database. E voglio disinfettare quei dati attraverso le migrazioni di database in Grails. Sto usando Postgres che salva LocalTime come Bytea (dati binari).

Quando chiamo WorkDone.duration mi restituisce una stringa della forma:

\ xaced0005737200176f72672e6a6f64612e74696d652e4c6f63616c54696d65fffff44abbf29def0200024a000c694c6f63616c4d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000000000000000737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae30300007870770500035554437878

Come posso estrarre il tempo da questa stringa?

+0

Hai provato a mantenere il LocalTime campo e utilizzare [Joda Tempo Grails dei plugin] (http://gpc.github.io/grails-joda-time/ guida/persistence.html)? Inoltre perché usi 'LocalTime' invece di' Duration' per la durata persistente? – musketyr

+0

Hai provato qualcosa del genere: def str = "" as byte[]; def os = new ObjectInputStream(new ByteArrayInputStream(str)); LocalTime.Property.readObject(os); Raphael

+0

No, non l'ho ancora provato. Proverò a vedere. –

risposta

1

Avresti dovuto eseguire una migrazione dei dati prima di modificare il tipo di dati in stringa.

Ecco cosa dovresti fare. 1. Cambia il tipo di dati del campo in LocalTime. 2. Creare un nuovo campo con Data stringa. 3. Scrivi uno script che otterrà tutte le date in LocalTime e convertirle in String e salvarle in un nuovo campo. 4. Una volta eseguita la migrazione dei dati, eliminare il vecchio campo e quindi rinominare il nuovo campo in durata.

+0

Sì, più tardi l'ho fatto solo io. Volevo vedere se c'era un altro modo. Grazie comunque. –

4

I vostri dati sono scaped in bytea formato Hex, (inizia con \ x) dare un'occhiata a PostgreSQL Docs

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

Dovete unescape prima letto come ObjectInputStream ang ottenere l'oggetto LocalTime, unescape e poi riprova come suggerisce Raffaele.

+1

Da java, String data = "\\ xaced0005737200176f72672e6 ...."; byte convertito [] = PGbytea.toBytes (data.getBytes()); ByteArrayInputStream in = new ByteArrayInputStream (convertito); System.out.println (nuova stringa (convertita)); – vzamanillo

+0

Grazie per la risposta –

+0

Prego :-) – vzamanillo

1

ho finito per fare le seguenti -

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 ]) 
      } 
     } 
Problemi correlati