【发布时间】:2016-11-10 20:11:57
【问题描述】:
我可以将一个案例类映射到一个光滑的数据库表:-
case class SomeTimeStamp(id: Option[Long], timestamp: java.sql.Timestamp )
class TimeStampTable(tag: Tag) extends Table[SomeTimeStamp](tag, "TSTAMP_TABLE") {
def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
def time = column[java.sql.Timestamp]("TIME")
def * = (id.?, time) <> (SomeTimeStamp.tupled, SomeTimeStamp.unapply)
}
案例类的字段默认情况下会被 slick 转换为数据库类型,所以一切都很好。
但这不起作用,如果我的案例类中的字段不是默认数据库类型。 Slick 允许我使用 MappedColumnType 提供与有效数据库类型之间的隐式转换,所以我尝试了这个,请注意我现在使用 Java LocalDatetime 而不是 sql Timestamp。
case class SomeLocalDate(id: Option[Long], timestamp: java.time.LocalDateTime )
class LocalDateTable(tag: Tag) extends Table[SomeLocalDate](tag, "TLDATE_TABLE") {
import LocalDateTable._
def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
def time = column[java.time.LocalDateTime]("TIME")
def * = (id.?, time) <> (SomeLocalDate.tupled, SomeLocalDate.unapply)
}
object LocalDateTable {
implicit val localDateTimeToTimestamp = MappedColumnType.base[LocalDateTime, Timestamp](
{ Timestamp.valueOf(_) } ,
{ ts => ts.toLocalDateTime }
)
}
我添加了隐式映射列,但在投影和隐式解析中仍然出现编译错误 编译错误是:-
[info] Compiling 1 Scala source to ...target/scala-2.11/classes...
[error] db/Tables.scala:92: could not find implicit value for parameter tt: slick.ast.TypedType[java.time.LocalDateTime]
[error] def time: Rep[LocalDateTime] = column[java.time.LocalDateTime]("TIME")
如果我修改了定义时间并添加了类型说明,我会得到一个不同的错误,见下文。
case class SomeLocalDate(id: Option[Long], timestamp: java.time.LocalDateTime )
class LocalDateTable(tag: Tag) extends Table[SomeLocalDate](tag, "TLDATE_TABLE") {
import LocalDateTable._
def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
def time: Rep[LocalDateTime] = column[java.time.LocalDateTime]("TIME")
def * = (id.?, time) <> (SomeLocalDate.tupled, SomeLocalDate.unapply)
}
object LocalDateTable {
implicit val localDateTimeToTimestamp = MappedColumnType.base[LocalDateTime, Timestamp](
{ Timestamp.valueOf(_) } ,
{ ts => ts.toLocalDateTime }
)
}
给出这个错误:-
[info] Compiling 1 Scala source to ...target/scala-2.11/classes...
[error] db/Tables.scala:92: could not find implicit value for parameter tt: slick.ast.TypedType[java.time.LocalDateTime]
[error] def time: Rep[LocalDateTime] = column[java.time.LocalDateTime]("TIME")
[error] ^
[error]db/Tables.scala:94: No matching Shape found.
[error] Slick does not know how to map the given types.
[error] Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List).
[error] Required level: slick.lifted.FlatShapeLevel
[error] Source type: (slick.lifted.Rep[Option[Long]], slick.lifted.Rep[java.time.LocalDateTime])
[error] Unpacked type: (Option[Long], java.time.LocalDateTime)
[error] Packed type: Any
[error] def * = (id.?, time) <> (SomeLocalDate.tupled, SomeLocalDate.unapply)
[error] ^
[error] two errors found
如果案例类没有默认支持的数据库类型(例如 LocalDateTime),我必须如何将案例类映射到表?
干杯
【问题讨论】:
-
你使用的是什么版本的 Slick?
-
使用 3.1.1 ,我想我已经找到了答案,见下文,这是一个 scala 隐式解析的弱点。感谢您的回复。