我正在尝试编写一个将Option [sql.Date]转换为Option [sql.Timestamp]的Mapper。为此,我使用以下代码:
package model.db
import java.sql.Date
import com.typesafe.slick.driver.ms.SQLServerDriver.simple._
abstract class RichTable[T](tag: Tag, name: String, schema: Option[String] = Some("dbo")) extends Table[T](tag, schema, name) {
def id: Column[Option[Long]] = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def cancelled: Column[Option[Date]] = column[Option[Date]]("cancelled")(DateMapper.sqlDate2SqlTimestampOptionMapper)
}
abstract class LoggableTable[T](tag: Tag, name: String, schema: Option[String] = Some("dbo")) extends RichTable[T](tag, name, schema) {
def createdAt: Column[Date] = column[Date]("created_at", O.NotNull)(DateMapper.sqlDate2SqlTimestampMapper)
}
object DateMapper {
val sqlDate2SqlTimestampMapper = MappedColumnType.base[java.sql.Date, java.sql.Timestamp](
{ sqlDate => new java.sql.Timestamp(sqlDate.getTime) },
{ sqlTimestamp => new java.sql.Date(sqlTimestamp.getTime) })
val sqlDate2SqlTimestampOptionMapper = MappedColumnType.base[scala.Option[java.sql.Date], scala.Option[java.sql.Timestamp]](
{ sqlDate => scala.Some(new java.sql.Timestamp(sqlDate.get.getTime)) },
{ sqlTimestamp => scala.Some(new java.sql.Date(sqlTimestamp.get.getTime)) })
}
sqlDate2SqlTimestampMapper 工作正常,因此我将其用作 sqlDate2SqlTimestampOptionMapper 的基本代码。
当我尝试编译时,出现以下错误:
错误:(21,126)找不到证据参数的隐含值 类型 com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType [选项[java.sql.Timestamp中]] val sqlDate2SqlTimestampOptionMapper = MappedColumnType.base [scala.Option [java.sql.Date] scala.Option [java.sql.Timestamp]](
错误:(21,126)不够 方法库的参数:(隐式证据$ 5: scala.reflect.ClassTag [Option [java.sql.Date]],隐式证据$ 6: com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType [选项[java.sql.Timestamp中]])com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType [选项[java.sql.Date]。 未指定的值参数证据$ 6。 VAL sqlDate2SqlTimestampOptionMapper = MappedColumnType.base [scala.Option [java.sql.Date] scala.Option [java.sql.Timestamp中]](
我该如何解决这个问题?
提前谢谢。
答案 0 :(得分:1)
您不需要选项映射器。删除这段代码。
val sqlDate2SqlTimestampOptionMapper = MappedColumnType.base[scala.Option[java.sql.Date], scala.Option[java.sql.Timestamp]](
{ sqlDate => scala.Some(new java.sql.Timestamp(sqlDate.get.getTime)) },
{ sqlTimestamp => scala.Some(new java.sql.Date(sqlTimestamp.get.getTime)) })
现在您的日期映射器变为
object DateMapper {
val sqlDate2SqlTimestampMapper = MappedColumnType.base[java.sql.Date, java.sql.Timestamp](
{ sqlDate => new java.sql.Timestamp(sqlDate.getTime) },
{ sqlTimestamp => new java.sql.Date(sqlTimestamp.getTime) })
}
如果您为某些T
提供映射,则在Slick中,您无需实现Option[T]
的映射
答案 1 :(得分:0)
就像@pamu所说的那样,没有选项的映射器。 stacktrace抱怨隐含的价值;所以我所做的就是让映射器受到影响,问题就解决了。
package model.db
import java.sql.Date
import com.typesafe.slick.driver.ms.SQLServerDriver.simple._
abstract class RichTable[T](tag: Tag, name: String, schema: Option[String] = Some("dbo")) extends Table[T](tag, schema, name) {
def id: Column[Option[Long]] = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def cancelled: Column[Option[Date]] = column[Option[Date]]("cancelled")
}
abstract class LoggableTable[T](tag: Tag, name: String, schema: Option[String] = Some("dbo")) extends RichTable[T](tag, name, schema) {
def createdAt: Column[Date] = column[Date]("created_at", O.NotNull)
}
object DateMapper {
implicit val sqlDate2SqlTimestampMapper = MappedColumnType.base[java.sql.Date, java.sql.Timestamp](
{ sqlDate => new java.sql.Timestamp(sqlDate.getTime) },
{ sqlTimestamp => new java.sql.Date(sqlTimestamp.getTime) })
}