我需要将数据从外部 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
,部分精度丢失了。我正在尝试找到一种解决此问题的方法,以便我仍然可以存储进入的时间。
我尝试过的:
使用自定义
org.jooq.Converter
在java.sql.Time
和java.time.LocalTime
之间转换但是与默认的org.jooq.impl.TimeToLocalTimeConverter
不同,保留时间对象的毫秒部分。这使我能够以毫秒精度保存和检索值(逗号后 3 位)。从 Internet 上的一些资源来看,似乎应该可以将
LocalTime
和LocalDateTime
直接与较新的 JDBC 驱动程序一起使用。为了尝试我尝试使用org.jooq.Converter
将java.time.LocalTime
转换为java.time.LocalTime
,基本上只是让物体通过。我希望 JOOQ 然后只使用这个转换器并将LocalTime
直接传递给数据库,但不幸的是它不能像这样工作。该值仍由默认实现处理,数据的小数部分丢失。为了超越 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.Time
和 U = java.time.LocalTime
)从 JDBC 中正确获取。
关于java - 使用 JOOQ 将小数秒保存为数据库中的 TIME 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56768509/