在使用Slick和Play时,我遇到了Scala下的兼容性问题。我试图通过Slick在我的一个模型模式中使用Date类型,然后在Play中的表单中提供该日期:
型号:
case class Test(id: Int, date: java.sql.Date)
class Tests(tag: Tag) extends Table[Test](tag, "Tests") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def date = column[java.sql.Date]("date")
def * = (id, date) <> (Test.tupled, Test.unapply)
}
控制器表单元素:
def testForm: Form[Test] = {
Form(
mapping(
"id" -> number,
"date" -> date)(Test.apply)(Test.unapply)))
}
但是,表单有编译错误,因为Slick使用java.sql.Date,而Play使用java.util.Date:
"type mismatch; found : (Int, java.sql.Date) => models.Test required: (Int, java.util.Date) => ?"
Slick或Play是否提供了内置支持以实现正确的互操作性,或者您是否必须在它们之间手动转换?如何/在哪里做得最好?
答案 0 :(得分:2)
Play支持java.sql.Date,您只需将映射作为
def testForm: Form[Test] = {
Form(
mapping(
"id" -> number,
"date" -> sqlDate)(Test.apply)(Test.unapply)))
}
请注意,我尚未对其进行测试,但the docs表明sqlDate
存在。
另一种选择是在光滑中定义java.util.Date和java.sql.Date之间的类型映射。看here看看如何。
另外,如果还没有,请查看joda time或某些scala wrapper。它可能会使日期和时间更容易。
答案 1 :(得分:1)
您可以在表单中使用jodaDate映射。还可以在模型和表列中使用joda DateTime,并为sql映射器定义一个隐式的joda。
def testForm: Form[Test] = {
Form(
mapping(
"id" -> number,
"date" -> jodaDate)(Test.apply)(Test.unapply)
)
import org.joda.time.DateTime
import java.sql.Timestamp
import play.api.db.slick.Config.driver.simple._ // I suppose you are using play-slick (https://github.com/freekh/play-slick) plugin
object JodaToSqlMapper {
implicit val dateTimeToDate = MappedColumnType.base[DateTime, Timestamp](
dateTime => new Timestamp(dateTime.getMillis),
timestamp => new DateTime(timestamp))
}
case class Test(id: Int, date: org.joda.time.DateTime)
import JodaToSqlMapper._
class Tests(tag: Tag) extends Table[Test](tag, "Tests") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def date = column[DateTime]("date")
def * = (id, date) <> (Test.tupled, Test.unapply _)
}