Scala 使用Slick为java.time.LocalDate创建自定义列映射

Scala 使用Slick为java.time.LocalDate创建自定义列映射,scala,slick,slick-3.0,Scala,Slick,Slick 3.0,我使用的是Slick 3.1.0-M2,我希望在我的表中使用java.time.LocalDate和java.time.LocalTime。我是这样做的: import java.sql.{Date, Time, Timestamp} import java.time.{LocalDate, LocalTime, LocalDateTime, ZoneOffset} trait DateTimeColumns { import slick.driver.PostgresDriver.ap

我使用的是Slick 3.1.0-M2,我希望在我的表中使用java.time.LocalDate和java.time.LocalTime。我是这样做的:

import java.sql.{Date, Time, Timestamp}
import java.time.{LocalDate, LocalTime, LocalDateTime, ZoneOffset}

trait DateTimeColumns {

  import slick.driver.PostgresDriver.api._

  implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))),
    d => d.toLocalDateTime
  )

  implicit val dateColumnType = MappedColumnType.base[LocalDate, Date](
    d => Date.valueOf(d),
    d => d.toLocalDate
  )

  implicit val timeColumnType = MappedColumnType.base[LocalTime, Time](
    localTime => Time.valueOf(localTime),
    time => time.toLocalTime
  )
}
所以我有3个隐式映射,但只有第一个可以编译。带有java.sql.Date和java.sql.Time的编译失败,原因是:

could not find implicit value for evidence parameter of type slick.driver.PostgresDriver.BaseColumnType[java.sql.Date]

当我在IntelliJ中执行隐式参数检查时,我可以看到第一个映射在文件JdbcTypesComponent.scala中找到TimestampJdbcType。在它旁边,我看到了TimeJdbcType和DateJdbcType。那么,为什么找到了第一个而其他的没有呢?

如果您检查
slick.driver.JdbcTypesComponent
,您会发现
特征隐式ColumnTypes
包含许多列类型的隐式,包括:

implicit def timeColumnType = columnTypes.timeJdbcType
implicit def dateColumnType = columnTypes.dateJdbcType
您定义的后两个名称实际上与默认名称同名

导入时更改它们的名称或重命名默认名称对我有效

import slick.driver.PostgresDriver.api._
import slick.driver.PostgresDriver.api.{ timeColumnType => DefaultTimeColumnType }

implicit val myDateColumnType = MappedColumnType.base[LocalDate, Date](
    ld => Date.valueOf(ld),
    d => d.toLocalDate
)

implicit val timeColumnType = MappedColumnType.base[LocalTime, Time](
    localTime => Time.valueOf(localTime),
    time => time.toLocalTime
)

啊,我不认为我会发现这个错误,所以非常感谢你!:)