Scala Slick 3.0 java8 OffsetDateTime和Timestamp

时间:2016-01-05 09:52:25

标签: java scala datetime slick

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

如何为Slick表映射编写一些隐式转换为java8 ZonedDateTime和Sql Timestamp之间的转换?

使用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编写类似内容吗?

2 个答案:

答案 0 :(得分:12)

简答

从Slick 3.1开始,简短的回答是使用OffsetDateTime,但您需要将其映射到CREATE TABLE public.trajectory_start_end_geom ( id integer NOT NULL DEFAULT nextval('trajectory_start_end_geom_id_seq'::regclass), trajectory_id bigint, user_id bigint, start_geom geometry(Polygon,4326), end_geom geometry(Polygon,4326), CONSTRAINT trajectory_start_end_geom_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); CREATE TABLE public.trajectory_geom ( id integer NOT NULL DEFAULT nextval('trajectory_geom_id_seq'::regclass), trajectory_id bigint, user_id bigint, geom geometry(LineString,4326), CONSTRAINT trajectory_geom_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); CREATE TABLE public.point ( id integer NOT NULL DEFAULT nextval('point_id_seq'::regclass), user_id bigint, date date, "time" time without time zone, lat double precision, lon double precision, trajectory_id integer, geom geometry(Geometry,4326), CONSTRAINT point_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); 列,而不是String才能使其正常工作与任何数据库。

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

OffsetDateTime.parse

更长的答案

OffsetDateTime的回答涵盖ZonedDateTimeWhat's the difference between java 8 ZonedDateTime and OffsetDateTime?之间的差异,所以我不会在此重复。

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

如果您通过there's support for java.time项目使用Postgres,slick-pg。我自己没有机会使用它,但显然值得研究一下你是否正在使用的数据库。例如,the test suite代表" date2"插件。

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

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

答案 1 :(得分:0)

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

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

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

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

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

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