2012-07-09 10 views
24

私はPlay Frameworkを学んできました。データベースにアクセスするには、anormコンポーネントのビルドを使用することをお勧めします。何故ならば、嵐の中のDateTimeはうまくサポートされていないからです。まだjava.util.Dateを使用しています。Play Framework 2.0のAnormのJoda DateTimeフィールド

アニメのJoda DateTimeまたはjava.sql.Timestampを使用する方法はありますか?

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

+0

@adis私はJPAについて考えていますが、これはあくまで... – bertzzie

答えて

41

更新:再生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の一部であるべきだと思います。 それがあなたを助けてくれたら教えてください。

+0

これが役に立ちます。どうもありがとうございました。 – bertzzie

+5

ありがとうございます。どこにこのコードを置くのですか? – Arty

+1

あなたはどこかのコードを(例えば、いくつかのユーティリティパッケージに)置いて、 'import AnormExtension._'でSQL文と結果を扱う場所にインポートします。関数は暗黙的に定義されているため、Anormはスコープ内に入ったら自動的に変換に使用します。 – notan3xit

関連する問題