我有一个看起来像这样的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
我必须有办法为这个演员写一条规则才有可能...... 我需要写一个new pattern matching rule吗?
答案 0 :(得分: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]
的隐式转换。
答案 1 :(得分:4)
尝试将Option[java.util.Date]
映射到Option[java.sql.Date]
,如下所示:
(success._6).map(d => new java.sql.Date(d.getTime))
还有一条建议,您可能希望将其实际映射到java.sql.Timestamp
,以便在将其写入数据库时不会失去任何时间精度,因为我认为{{1}会出现这种情况。 }。所以代码是:
java.sql.Date