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]to的隐式转换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))

再提一句建议,您可能希望将其实际映射到 ajava.sql.Timestamp以便在将其写入数据库时​​不会丢失任何时间精度,因为我相信java.sql.Date. 所以代码是:

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