2012-07-09 23 views
24

He estado aprendiendo Play Framework, y la forma recomendada de acceder a una base de datos es utilizando el componente build in anorm. La cosa es que no hay un buen soporte para DateTime en anorm. Todavía está usando java.util.Date.Joda DateTime Field en el Anorm de Play Framework 2.0

¿Hay alguna forma de utilizar Joda DateTime o java.sql.Timestamp en anorm?

Si no hay forma de usar Joda o java.sql, ¿podemos agregar un módulo para eso?

+0

@adis Creo que se trata de JPA, y esto es para anorm ... – bertzzie

Respuesta

41

actualización: Desde el juego 2.3.7, ahora es natively supported.

Estoy usando la siguiente pieza de código para trabajar con DateTime sin problemas 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())) 
    } 
} 

} 

Creo que definitivamente debe ser parte de Anorm, solo necesita ser pulido y probado. Avíseme si le ha ayudado.

+0

esto ayuda. Muchas gracias. – bertzzie

+5

Gracias. ¿Dónde colocas normalmente este código? – Arty

+1

Simplemente coloque el código en algún lugar (por ejemplo, en algún paquete de utilidades) e impórtelo donde maneje las declaraciones SQL y los resultados con 'import AnormExtension._'. Como las funciones se definen como 'implícitas ', Anorm las usará automáticamente para la conversión una vez que estén dentro del alcance. – notan3xit

Cuestiones relacionadas