2013-11-22 25 views
6

Grails domain sınıfında bir LocalTime alanı (Joda Time kullanarak) vardı. 24 saat daha büyük süresini destekleyebilir böylece Dize sicimlerinden joda süresini deserialize?

Class WorkDone{ 
    LocalTime duration 
} 

Şimdi (Metin kısıtı) Dize için bu alanı değiştirmiş.

String duration 

Sorun şu anda veritabanında bazı veriler var. Ve bu veriyi Grails'deki veritabanı geçişleri ile dezenfekte etmek istiyorum. LocalTime'ı Bytea (ikili veri) olarak kaydeden Postgres'i kullanıyorum.

Nasıl bu dizeden zaman çıkarabilir xaced0005737200176f72672e6a6f64612e74696d652e4c6f63616c54696d65fffff44abbf29def0200024a000c694c6f63616c4d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000000000000000737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae30300007870770500035554437878 \:

ararım WorkDone.duration bana formun bir dize döndürür?

+0

sen [Joda Zaman Grails Eklentisi] (alan LOCALTIME tutmak ve kullanımı denediniz http://gpc.github.io/grails-joda-time/ rehber/persistence.html)? Ayrıca, sürekli süre için neden 'Süre' yerine 'LocalTime 'kullanıyorsunuz? – musketyr

+0

Şun gibi bir şey denediniz mi: def str = "" as byte[]; def os = new ObjectInputStream(new ByteArrayInputStream(str)); LocalTime.Property.readObject(os); Raphael

+0

Hayır Bunu denemedim. Dener ve görecek. –

cevap

1

Veri türünüzü Dize olarak değiştirmeden önce bir veri geçişi yapmış olmanız gerekir.

Yapmanız gereken şey. 1. Alanın Veri türünü tekrar LocalTime olarak değiştirin. 2. String Date ile yeni bir alan oluşturun. 3. Tüm tarihi LocalTime'da alacak ve String'e dönüştürecek ve yeni alana kaydedecek bir komut dosyası yazın. 4. Verilerinizi taşıdıktan sonra eski alanı silin ve yeni alanınızı yeniden adlandırın.

Veri bytea Hex formatında scaped edilir
+0

Evet daha sonra bunu yaptım. Başka bir yolu olup olmadığını görmek istedim. Yine de teşekkürler. –

4

, çıkış yapılmış Bunu daha önce LOCALTIME nesneyi almak ObjectInputStream ang olarak okunmalıdır okunabilir hale getirmek için var PostgreSQL docs

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

bakmak (\ x ile başlar) o ve Raphael önerdiği gibi tekrar deneyin.

+1

Java'dan, String verileri = "\\ xaced0005737200176f72672e6 ...."; byte dönüştürülmüş [] = PGbytea.toBytes (data.getBytes()); ByteArrayInputStream = yeni ByteArrayInputStream (dönüştürülmüş); System.out.println (yeni Dize (dönüştürülmüş)); – vzamanillo

+0

Cevabınız için teşekkürler –

+0

Rica ederim :-) – vzamanillo

1

yaptığım sona erdi aşağıdaki -

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