我一直在学习Play Framework,建议的访问数据库的方法是使用内置的anorm组件。事实是,在主动脉中没有对DateTime的良好支持。它仍在使用java.util.Date

有什么办法可以在anorm中使用Joda DateTime或java.sql.Timestamp?

如果无法使用Joda或java.sql,我们可以为此添加模块吗?

最佳答案

更新:从播放2.3.7开始,现在是natively supported

我正在使用以下代码与Anorm无缝地与DateTime一起使用。

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

}

我认为它应该绝对是Anorm的一部分,只需要进行抛光和更多测试即可。
让我知道它是否对您有帮助。

10-04 11:03