繁体   English   中英

Scala Slick 3.0隐式映射java8 OffsetDateTime和Timestamp

[英]Scala Slick 3.0 implicit mapping between java8 OffsetDateTime and Timestamp

首先是如果我想将带有时区的日期时间映射到Slick,我应该使用OffsetDateTime还是ZonedDateTime 至于Joda,我们只能使用DateTime

我怎么能写一些隐式的转换java8 ZonedDateTime和Sql Timestamp for Slick表映射?

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

对于我当前的代码,我只使用Java8 LocalDateTime并且我在隐藏之间写入隐式映射。

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

不太确定我可以使用ZonedDateTimeOffsetDateTime写类似的OffsetDateTime吗?

简答

从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 之间的区别由java 8 ZonedDateTime和OffsetDateTime之间的区别答案所涵盖 所以我在此不再重复。

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

如果你使用Postgres, 那么通过slick -pg项目支持java.time 我自己没有机会使用它,但显然值得调查一下,如果这是你正在使用的数据库。 例如,参见“date2”附加组件的测试套件

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

好消息是,在Slick中添加了对java.time数据类型的支持的主动拉取请求。 您可以监控故障单的进度该进度当前是为Slick 3.2安排的。

有一个我认为没有发布的分支,但它确实有Java8时间支持:

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

它非常稳定,我一直在使用HSQLDB生产它。 以及相关规范/拉取请求:

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

如果您正在寻找代码生成,使用上面提到的分支并不太难,本文将介绍如何执行此操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM