【问题标题】:Scala Slick 3.0 implicit mapping between java8 OffsetDateTime and Timestampjava8 OffsetDateTime 和 Timestamp 之间的 Scala Slick 3.0 隐式映射
【发布时间】:2016-04-09 02:22:03
【问题描述】:

首先,如果我想将带有时区的日期时间映射到 Slick,我应该使用哪个类 OffsetDateTimeZonedDateTime?至于 Joda,我们只能使用DateTime

我如何编写一些隐式在 java8 ZonedDateTime 和 Sql Timestamp 之间进行转换以进行 Slick 表映射?

使用 joda DateTime 包含时区信息似乎很简单。但是一旦切换到 Java8,我不太确定我应该使用 ZonedDateTime 还是 OffsetDateTime,因为 http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html 建议使用 OffsetDateTime。

对于我当前的代码,我只使用 Java8 LocalDateTime 并编写了以下隐式以在 slick 之间进行映射。

implicit val JavaLocalDateTimeMapper = MappedColumnType.base[LocalDateTime, Timestamp](
    l => Timestamp.valueOf(l),
    t => t.toLocalDateTime
  )

不太确定我是否可以使用ZonedDateTimeOffsetDateTime 编写类似的代码?

【问题讨论】:

    标签: java scala datetime slick


    【解决方案1】:

    简答

    从 Slick 3.1 开始,简短的回答是使用 OffsetDateTime,但您需要将其映射到 String 列,而不是 Timestamp 才能与任何数据库一起使用。

    也就是说,您需要MappedColumnType.base[OffsetDateTime, String]。您可以使用toStringOffsetDateTime.parse 进行字符串转换:

    scala> import java.time._
    import java.time._
    
    scala> val paris = ZoneId.of("Europe/Paris")
    paris: java.time.ZoneId = Europe/Paris
    
    scala> OffsetDateTime.now(paris)
    res0: java.time.OffsetDateTime = 2016-01-05T20:38:46.473+01:00
    
    scala> OffsetDateTime.parse(res0.toString)
    res2: java.time.OffsetDateTime = 2016-01-05T20:38:46.473+01:00
    

    更长的答案

    OffsetDateTimeZonedDateTime 的区别在What's the difference between java 8 ZonedDateTime and OffsetDateTime? 的回答中已经讲过了,这里不再赘述。

    但是,您需要阅读该内容以确定简短答案是否符合您的情况。

    如果你使用 Postgres,there's support for java.time 通过slick-pg 项目。我自己没有机会使用它,但如果那是您正在使用的数据库,显然值得调查。有关“date2”附加组件,请参见 the test suite

    更好的答案(或未来的答案!)

    好消息是有一个积极的拉取请求来添加对 Slick 中 java.time 数据类型的支持。您可以监控进度on the ticket,目前计划用于 Slick 3.2。

    【讨论】:

    • 谢谢理查德,最后的答案是我所期望的:-)
    • 在 Slick 3.3.0 中内置了对 Slick 中 java.time 映射的支持(即最后一个答案:“未来答案”)
    【解决方案2】:

    我不相信曾经发布过一个分支,但它确实支持 Java8 时间:

    https://github.com/xavier-fernandez/slick

    它非常稳定,我一直在 prod 中将它与 HSQLDB 一起使用。以及相关的规范/拉取请求:

    https://github.com/slick/slick/pull/1349

    如果你正在寻找代码生成,这不是太难,使用上面提到的fork,这篇文章描述了如何去做:

    https://github.com/slick/slick/pull/1349#issuecomment-245566307

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2013-07-01
      • 2016-02-25
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多