And*_*etz 5 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.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
)
}
Run Code Online (Sandbox Code Playgroud)
所以我有3个隐式映射,但只有第一个编译.java.sql.Date和java.sql.Time的编译失败了:
could not find implicit value for evidence parameter of type slick.driver.PostgresDriver.BaseColumnType[java.sql.Date]
Run Code Online (Sandbox Code Playgroud)
当我在IntelliJ中进行隐式参数检查时,我可以看到第一个映射在文件JdbcTypesComponent.scala中找到TimestampJdbcType.紧挨着我,我看到了TimeJdbcType和DateJdbcType.那么为什么第一个被发现但其他人不是?
如果你检查slick.driver.JdbcTypesComponent,你会发现一个trait ImplicitColumnTypes包含很多列类型的含义,包括:
implicit def timeColumnType = columnTypes.timeJdbcType
implicit def dateColumnType = columnTypes.dateJdbcType
Run Code Online (Sandbox Code Playgroud)
您定义的后两者实际上与默认名称具有相同的名称.
导入时更改它们的名称或重命名默认值.
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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1769 次 |
| 最近记录: |