无法找到类型的证据参数的隐含值

时间:2017-01-25 14:52:27

标签: scala slick

我正在尝试编写一个将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中]](

我该如何解决这个问题?

提前谢谢。

2 个答案:

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