java - 使用 JOOQ 将小数秒保存为数据库中的 TIME 数据类型

标签 java jdbc time mariadb jooq

我需要将数据从外部 API 存储到 MariaDB。其中一个字段作为 java.time.LocalTime 出现,并使用 TIME 类型存储。它可以包含几分之一秒。我正在使用 JOOQ 来构建/执行 SQL。

DB 字段是使用 TIME(6) 创建的,数据在那里正确地列为“hh:mm:ss.ssssss”。然而,每当我从我的应用程序中保存数据时,小数部分就会被清零。例如:12:34:56.123456 -> 12:34:56.000000

我意识到这是由于 JOOQ 在内部使用 java.sql.Time 并且由于它扩展了 java.util.Date,部分精度丢失了。我正在尝试找到一种解决此问题的方法,以便我仍然可以存储进入的时间。

我尝试过的:

  1. 使用自定义 org.jooq.Converterjava.sql.Timejava.time.LocalTime 之间转换但是与默认的 org.jooq.impl.TimeToLocalTimeConverter 不同,保留时间对象的毫秒部分。这使我能够以毫秒精度保存和检索值(逗号后 3 位)。

  2. 从 Internet 上的一些资源来看,似乎应该可以将 LocalTimeLocalDateTime 直接与较新的 JDBC 驱动程序一起使用。为了尝试我尝试使用 org.jooq.Converterjava.time.LocalTime 转换为 java.time.LocalTime ,基本上只是让物体通过。我希望 JOOQ 然后只使用这个转换器并将 LocalTime 直接传递给数据库,但不幸的是它不能像这样工作。该值仍由默认实现处理,数据的小数部分丢失。

  3. 为了超越 JOOQ 默认功能,我尝试创建一个自定义的 org.jooq.Binding,它将直接使用传入的对象。然而,当我尝试这样做时,使用 JOOQ custom binding example 作为基础,我无法实现必要的方法。例如,示例中有:

    public void get(BindingGetStatementContext<JsonElement> ctx) throws SQLException {
        ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
    }

...我需要做类似的事情:

    public void get(BindingGetStatementContext<LocalTime> ctx) throws SQLException {
        ctx.convert(converter()).value(ctx.statement().getLocalTime(ctx.index()));
    }

但是 java.sql.CallableStatement 没有这样的方法。我是不是误解了什么是可能的?

我知道 JOOQ which will support for fractional seconds in the future 中有一个 Unresolved 问题,但这似乎还有很长的路要走,我正在寻找一个现在可行的解决方案。

最佳答案

您无法使用 Converter 解决此问题,因为 jOOQ 将在内部继续使用 JDBC 类型 java.sql.Time在幕后。您需要实现自己的 Binding .如果您的 JDBC 驱动程序支持 JSR 310 类型,您遇到问题的方法必须如下所示:

public void get(BindingGetStatementContext<LocalTime> ctx) throws SQLException {
    ctx.value(ctx.statement().getObject(ctx.index(), LocalTime.class));
}

注意,你不应该使用 Converter在这种情况下,因为您已经确保 Binding<T, U><U>类型(其中 T = java.sql.TimeU = java.time.LocalTime )从 JDBC 中正确获取。

关于java - 使用 JOOQ 将小数秒保存为数据库中的 TIME 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56768509/

相关文章:

jdbc - 是否可以以编程方式向 Connector/J 提供 Java KeyStore 和 TrustStore?

java - @PreAuthorize 注解无法解析变量

java - 如何使用 Runtime.exec 重定向 dmesg 的数据?

java - Java链表实现中的head是什么

mysql - 在 MySQL 中插入行时,CURRENT_TIME 时间戳不正确,我使用的是 AWS RDS

time - gnuplot - 如何将读取时间格式转换为 double /浮点/将其用作函数参数

gwt - 大型 GWT 项目和编译时间问题

java - 在 Java EE 6 中生成激活 url

mysql - 为什么 MariaDB 上的 REPETEABLE_READ 不产生幻读?

java - Spring、Hibernate、JDBC的关系