光滑的图书馆与播放 - 日期类型不兼容?

时间:2014-04-08 15:58:10

标签: scala playframework playframework-2.2 slick

在使用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是否提供了内置支持以实现正确的互操作性,或者您是否必须在它们之间手动转换?如何/在哪里做得最好?

2 个答案:

答案 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 _)
}