1

次のような Play フォームがあります。

val form = Form( tuple( 
        /* 5 more fields */ 
        "dueDate" -> optional(date) 
)  )

"dueDate"Slick のオブジェクトに挿入しようとしています。

newAuditForm.bindFromRequest.fold(
    errors => BadRequest(views.html.error(form)),
    success => {
        Database.forDataSource(DB.getDataSource()) withSession {
            Things.forInsert.insert Thing(
                (success._6).asInstanceOf[Option[java.sql.Date]] 
            )
        }
    }
)

ここで、Slick は のみを処理しjava.sql.Date、Playはオブジェクトjava.util.Date内の (?)のみを処理しFormます。

asInstanceOf返品の使用:

     ClassCastException: java.util.Date cannot be cast to java.sql.Date

このキャストを可能にするためのルールを作成する方法が必要です...新しいパターン マッチング ルールを作成する必要がありますか?

4

2 に答える 2

5

はサブクラスであるjava.util.Dateためjava.sql.Date、キャストできません。java.sql.Dateあなたができることは、の新しいインスタンスを作成することですjava.sql.Date:

val x = new java.util.Date()
val y = new java.sql.Date(x.getTime())

便利だと思われる場合は、暗黙的な変換を定義できます。

implicit def date2sqlDate(d: java.util.Date) = new java.sql.Date(d.getTime())

ただし、これはオプション内で変換されません (キャストではなく変換であるため、キャストも機能しません)。

次のいずれかを実行できます。

val x: Option[java.util.Date]
x.map(_: java.sql.Date) // using implicit conversion

または、明示的に記述します。

x.map(d => new java.sql.Date(d.getTime()))

頻繁に変換が必要な場合は、 からOption[java.util.Date]への暗黙的な変換を記述することを検討してくださいOption[java.sql.Date]

于 2013-06-21T18:10:44.690 に答える
4

を次のようにマッピングしてみてくださいOption[java.util.Date]Option[java.sql.Date]

(success._6).map(d => new java.sql.Date(d.getTime))

アドバイスをもう 1 つ言います。実際にこれを にマップしjava.sql.Timestampて、DB に書き込むときに時間の精度が失われないようにすることをお勧めしますjava.sql.Date。したがって、コードは次のようになります。

(success._6).map(d => new java.sql.Timestamp(d.getTime))
于 2013-06-21T18:11:15.887 に答える