2017-01-25 2 views
1

Я пытаюсь написать Mapper, который преобразует Option [sql.Date] в Option [sql.Timestamp]. Для этого я использую следующий код:Не удалось найти неявное значение для параметра доказательства типа

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.

Когда я пытаюсь скомпилировать, я получаю следующее сообщение об ошибке:

Error:(21, 126) could not find implicit value for evidence parameter of type com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType[Option[java.sql.Timestamp]] val sqlDate2SqlTimestampOptionMapper = MappedColumnType.base[scala.Option[java.sql.Date], scala.Option[java.sql.Timestamp]](

Error:(21, 126) not enough arguments for method base: (implicit evidence$5: scala.reflect.ClassTag[Option[java.sql.Date]], implicit evidence$6: com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType[Option[java.sql.Timestamp]])com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType[Option[java.sql.Date]]. Unspecified value parameter evidence$6. val sqlDate2SqlTimestampOptionMapper = MappedColumnType.base[scala.Option[java.sql.Date], scala.Option[java.sql.Timestamp]](

Как я могу это исправить?

Заранее спасибо.

ответ

0

Как @pamu сказал, что нет никакой необходимости для картографа для опции. Стекловатка жаловалась на неявное значение; так что я сделал, чтобы заставить трансплантировать, и проблема была решена.

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) }) 
} 
1

Вам не нужен параметр mapper. Удалите этот фрагмент кода.

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

В Slick, если вы даете отображение для некоторого T, то вам не нужно реализовать отображение для Option[T]

+0

Я сделал это сначала. Но я получил ошибку несоответствия типа: Ошибка: (9, 86) несоответствие типа; найдено: com.typesafe.slick.driver.ms.SQLServerDriver.BaseColumnType [java.sql.Date] (который расширяется до) scala.slick.jdbc.JdbcType [java.sql.Date] с помощью scala.slick.ast. BaseTypedType [java.sql.Date] требуется: scala.slick.ast.TypedType [Option [java.sql.Date]] def cancel: Column [Option [Date]] = column [Option [Date]] («отменено» ") (DateMapper.sqlDate2SqlTimestampMapper) – RafaelTSCS

+0

@RafaelTSCS вы можете поделиться найденным решением? – Mzf

+0

Сделано! Проблема заключалась в том, что картограф не был неявным. – RafaelTSCS