我有一个带有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)打包类型:任何
答案 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)
}