2012-07-09 14 views
24

Ho studiato Play Framework e il modo consigliato per accedere a un database è l'utilizzo del componente anorm in build. Il fatto è che non c'è un buon supporto per DateTime in anorm. Sta ancora usando java.util.Date.Joda DateTime Field su Play Anorm di Framework 2.0

C'è un modo per utilizzare Joda DateTime o java.sql.Timestamp in anorm?

Se non c'è modo di usare Joda o java.sql, possiamo aggiungere un modulo per questo?

+0

@adis Penso che si tratti di JPA, e questo è per anorm ... – bertzzie

risposta

41

aggiornamento: Dal momento che il gioco 2.3.7 questo è ora natively supported.

Sto usando il seguente pezzo di codice per lavorare con DateTime perfettamente con Anorm.

import org.joda.time._ 
import org.joda.time.format._ 
import anorm._ 

object AnormExtension { 


val dateFormatGeneration: DateTimeFormatter = DateTimeFormat.forPattern("yyyyMMddHHmmssSS"); 

implicit def rowToDateTime: Column[DateTime] = Column.nonNull { (value, meta) => 
    val MetaDataItem(qualified, nullable, clazz) = meta 
    value match { 
     case ts: java.sql.Timestamp => Right(new DateTime(ts.getTime)) 
     case d: java.sql.Date => Right(new DateTime(d.getTime)) 
     case str: java.lang.String => Right(dateFormatGeneration.parseDateTime(str)) 
     case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass)) 
    } 
} 

implicit val dateTimeToStatement = new ToStatement[DateTime] { 
    def set(s: java.sql.PreparedStatement, index: Int, aValue: DateTime): Unit = { 
     s.setTimestamp(index, new java.sql.Timestamp(aValue.withMillisOfSecond(0).getMillis())) 
    } 
} 

} 

penso che dovrebbe essere definitivamente parte della Anorm, solo bisogno di essere lucido e più collaudato. Fammi sapere se ti ha aiutato.

+0

questo aiuta. Grazie mille. – bertzzie

+5

Grazie. Dove mettete normalmente questo codice? – Arty

+1

Basta inserire il codice da qualche parte (ad esempio in qualche pacchetto di utilità) e importarlo dove si gestiscono le istruzioni SQL ei risultati con 'import AnormExtension._'. Poiché le funzioni sono definite come 'implicite', Anorm le userà automaticamente per la conversione una volta che sono nella portata. – notan3xit