如何在Jooq中表示没有区域的Postgres TIMESTAMP

时间:2019-03-04 20:47:51

标签: postgresql scala jooq

我有一个使用Joda time lib的Scala应用程序,该应用程序已连接到Postgres db,并且我想使用Jooq lib。我想将带有时间戳的数据存储在UTC中,但是我不知道如何在Jooq中进行转换。请参阅表创建脚本。

CREATE TABLE some_event (
    id SERIAL NOT NULL PRIMARY KEY,
    timestamp TIMESTAMP NOT NULL,
);

我尝试了以下类似操作,但是无法正常工作。

  import org.joda.time.DateTime
  import java.time.Instant
  import java.sql.Timestamp

  private val zoneId = ZoneId.of("UTC")
  val converter: Converter[Timestamp, DateTime] =
    Converter.ofNullable(
      classOf[Timestamp],
      classOf[DateTime],
      (t: Timestamp) => {
        val i = t.toInstant
        val z = ZonedDateTime.ofInstant(i, zoneId)
        new DateTime(z.toInstant.toEpochMilli)
      },
      (t: DateTime) => {
        val i = Instant.ofEpochMilli(t.getMillis)
        val z = ZonedDateTime.ofInstant(i, zoneId)
        Timestamp.from(z.toInstant)
      },
    )
  protected val DATE_TIME_TYPE: DataType[DateTime] = SQLDataType.TIMESTAMP.asConvertedDataType(converter)

  private object SomeEvent {
    val ID: Field[Int] = field("id", classOf[Int])
    val TIMESTAMP: Field[DateTime] = field("timestamp", DATE_TIME_TYPE)
  }

我还尝试使用OffsetDateTime实现转换器,但是会抛出异常。我无法更改表并使用TIMESTAMP WITH ZONE。我在先前的实现中使用了Doobie lib,其中使用了java.time.Instant,但是Jooq似乎不支持Instant。你有什么想法吗?谢谢。

0 个答案:

没有答案