【问题标题】:Jooq - Date column with timeJooq - 带时间的日期列
【发布时间】:2014-06-26 22:26:31
【问题描述】:

在我的 oracle 数据库中,在一个表中,我有一个 Date 列。我使用 jooq 获取它,它是一个简单的选择查询。 jooq 获取列值,但没有时间。我错过了任何配置吗?

【问题讨论】:

  • 我认为这与日期/时间/时间戳映射有关。数据库显然是一个完整的时间戳,并且映射读取为 java.util.Date 而不是 java.sql.Date,因为后者没有时间组件
  • 列 CREATE_TS 的类型为 DATE。在jooq生成的表类中,public final org.jooq.TableField CREATE_TS = createField( "CREATE_TS", org.jooq.impl.SQLDataType.日期,这个);

标签: java jdbc jooq


【解决方案1】:

默认情况下,jOOQ 将 Oracle 的 DATE 列映射到 java.sql.DateTIMESTAMPjava.sql.Timestamp

如果您想使用 Oracle 的历史 DATE 语义(日期时间精确到秒),那么您可以使用 <dateAsTimestamp/> 代码生成标志让 jOOQ 也为 DATE 列生成 java.sql.Timestamp 列:

<!-- Generate java.sql.Timestamp fields for DATE columns. This is
     particularly useful for Oracle databases.
     Defaults to false -->
<dateAsTimestamp>false</dateAsTimestamp>

这里的详细信息: http://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/

这个答案也在jOOQ User Group上给出

【讨论】:

  • 由于您现在已弃用dateAsTimestamp,因此我不太清楚如何仅使用绑定来实现上述目标。我尝试创建和使用类似于您的org.jooq.impl.DateAsTimestampBinding 的绑定(实现Binding&lt;Date, Timestamp&gt;),但这会导致Oracle 日期的时间部分丢失。所以到目前为止,我一直坚持使用dateAsTimestamp 标志。
  • @ErlendKristiansen:是的,这种弃用有点为时过早,因为还没有易于实施的替代品。另见my answer on the user group。目前,我建议使用 deprecated 标志。
【解决方案2】:

我在网上能找到的关于这个问题的所有答案都或多或少与代码生成有关,但我正在从事一个框架项目,不想将我的代码与任何特定的数据库耦合。

我遇到的问题是,JOOQ 在调用Record.getValue() 方法时,从DATE 列的数据中截断了时间部分。

根据JOOQ's doc,我通过从底层ResultSet 获取DATE 列的值而不是使用Record.getValue() 来解决这个问题。

示例代码:

ResultQuery<Record> query;
Cursor<Record> cursor = query.fetchLazy(fetchSize);
cursor.fetchOne(new RecordMapper<Record, Map<String, Object>>() {
    @Override
    public Map<String, Object> map(final Record record) {
        for (Field<?> field : record.fields()) {
            record.getValue(field, converter);
            if ("date".equals(field.getDataType().getTypeName())) {
                resultSet resultSet = cursor.resultSet();
                try {
                    Timestamp ts = resultSet.getTimestamp(field.getName());
                } catch (SQLException e) {
                    // ......
                }
            }
        }
    }
);

【讨论】:

  • SQL 标准 DATE 类型以及 JDBC java.sql.Date 类型不支持任何时间信息 - 与 Oracle 不同。在 jOOQ 3.5 之前,有 &lt;dateAsTimestamp/&gt; 代码生成标志,在 jOOQ 3.5 中,您还可以指定 org.jooq.Binding 将您的 Oracle DATE 类型绑定到最合适的 Java 类型
  • @LukasEder 感谢您的评论!我确实看过 JOOQ 3.5 附带的绑定功能,但似乎只有在我使用 JOOQ 的代码生成器时才可用,是这样吗?
  • 嗯,不,您也可以通过DataType.asConvertedDataType(Binding) 使用Binding,而无需代码生成器。当然,使用代码生成器让这一步更方便一点……
猜你喜欢
  • 2021-07-23
  • 2019-12-02
  • 1970-01-01
  • 2019-02-11
  • 2015-10-05
  • 1970-01-01
  • 2021-08-02
  • 2020-03-19
  • 2021-10-06
相关资源
最近更新 更多