gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:37:22 25 4
gpt4 key购买 nike

我正在使用 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 , 你会发现一个 trait ImplicitColumnTypes 包含许多列类型的隐式,包括:

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
)

关于scala - 使用 Slick 为 java.time.LocalDate 创建自定义列映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com