将org.joda.time.DateTime隐式转换为java.sql.Timestamp从模型到光滑表[]

时间:2016-11-06 19:59:45

标签: scala datetime playframework slick

我有一个带有org.joda.time.DateTime的模型 但是我传递了一个由光滑对象Table []使用的java.sql.Timestamp,我尝试使用隐式转换,但它不起作用

import models.Carros.convertDateToTimestamp // this has a parameter DateTime and a return Timestamp
def * = (id, name, year, description, img, keywords, state, model, datein) <>
((Carro.apply _).tupled, Carro.unapply) // so here when unpacking shouldn't the implicit conversion do it's job?

显示的错误如下:

  

找不到匹配的形状。光滑不知道如何映射给定的   类型。可能的原因:表[T]中的T与您的*不符   投影。或者您在查询中使用不受支持的类型(例如scala   列表)。所需级别:slick.lifted.FlatShapeLevel源类型:   (slick.lifted.Rep [Option [Long]],slick.lifted.Rep [String],   slick.lifted.Rep [Int],slick.lifted.Rep [String],   slick.lifted.Rep [String],slick.lifted.Rep [String],   slick.lifted.Rep [String],slick.lifted.Rep [Long],   slick.lifted.Rep [java.sql.Timestamp])解压缩类型:(选项[长],   String,Int,String,String,String,String,Long,   org.joda.time.DateTime)打包类型:任何

2 个答案:

答案 0 :(得分:1)

您需要将org.joda.DateTime的类型声明为java.sql.Timestamp,而不是class CarroTable extends Table[Carro](tag: "carro") { ... val datebin = column[org.joda.DateTime]("datebin") def * = (id, name, year, description, img, keywords, state, model, datein) <> (Carro.tupled, Carro.unapply) }

implicit val JodaDateTimeMapper = MappedColumnType.base[DateTime, Timestamp](
  dt => new Timestamp(dt.getMillis),
  ts => new DateTime(timestamp.getTime())
)

然后确保你有一个隐式类型映射器:

{{1}}

答案 1 :(得分:0)

罗曼的回答是正确的,但有一点需要注意......

如果将隐式MappedColumnType放在同一个文件中,则必须将其隐藏在Table定义之上,或者将其放在另一个文件中并导入它。如果你不这样做,则隐式解决方案无法找到它。

您可以在此other StackOverflow question

中看到这一点

所以为了迂腐,你应该这样做: -

object implicitDateTimeConverters {
  implicit val JodaDateTimeMapper = MappedColumnType.base[DateTime, Timestamp](
    dt => new Timestamp(dt.getMillis),
    ts => new DateTime(timestamp.getTime())
  )
}

import implicitDateTimeConverters._

class CarroTable extends Table[Carro](tag: "carro") {
  ...
  val datebin = column[org.joda.DateTime]("datebin")

  def * = (id, name, year, description, img, keywords, state, model, datein) <> (Carro.tupled, Carro.unapply)

}