24

私は Play Framework を学んでおり、データベースにアクセスするための推奨される方法は、組み込みの anorm コンポーネントを使用することです。問題は、Anorm で DateTime を適切にサポートしていないことです。それはまだ使用していjava.util.Dateます。

Joda DateTime または java.sql.Timestamp を標準で使用する方法はありますか?

Joda や java.sql を使用する方法がない場合、そのためのモジュールを追加できますか?

4

1 に答える 1

41

更新: play 2.3.7 以降、これはネイティブにサポートされるようになりました。

次のコードを使用して、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の一部であるべきだと思います.ただ洗練され、さらにテストされる必要があります. それがあなたを助けたかどうか私に知らせてください。

于 2012-08-15T18:38:40.490 に答える