可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

Oracle DATE 数据类型

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

Oracle 的 DATE 数据类型不符合 SQL 标准。它实际上是 TIMESTAMP(0),即小数秒精度为零的 TIMESTAMP。Oracle DATE 类型最合适的 JDBC 类型是 java.sql.Timestamp

性能影响

当将 TIMESTAMP 变量绑定到 SQL 语句时,与其将这些变量截断为 DATE,基于成本的优化器可能会选择使用 Oracle INTERNAL_FUNCTION() 将数据库列从 DATE 扩展到 TIMESTAMP,这会阻止索引的使用。 有关此行为的详细信息,请参见此 Stack Overflow 问题

使用数据类型绑定来解决此问题

解决此问题的最佳方法是实现自定义数据类型绑定,该绑定为每个绑定变量生成 CAST 表达式

@Override
public final void sql(BindingSQLContext<Timestamp> ctx) throws SQLException {
    ctx.render()
       .visit(keyword("cast")).sql('(')
       .visit(val(ctx.value())).sql(' ')
       .visit(keyword("as date")).sql(')');
}

已弃用的功能

jOOQ 的历史版本曾经支持 <dateAsTimestamp/> 标志,该标志可以与现成的 org.jooq.impl.DateAsTimestampBinding 一起用作 自定义数据类型绑定

XML(独立和 Maven)
编程方式
Gradle (Kotlin)
Gradle (Groovy)
Gradle(第三方)
<configuration>
  <generator>
    <database>
      <!-- Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated. -->
      <dateAsTimestamp>true</dateAsTimestamp>

      <!-- Define a custom binding for such DATE as TIMESTAMP columns -->
      <forcedTypes>
        <forcedType>
          <name>TIMESTAMP</name>
          <userType>java.sql.Timestamp</userType>
          <binding>org.jooq.impl.DateAsTimestampBinding</binding>
          <includeTypes>DATE</includeTypes>
        </forcedType>
      </forcedTypes>
    </database>
  </generator>
</configuration>

有关更多详细信息,请参见 配置 XSD独立代码生成maven 代码生成

new org.jooq.meta.jaxb.Configuration()
  .withGenerator(new Generator()
    .withDatabase(new Database()

      // Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated.
      .withDateAsTimestamp(true)

      // Define a custom binding for such DATE as TIMESTAMP columns
      .withForcedTypes(
        new ForcedType()
          .withName("TIMESTAMP")
          .withUserType("java.sql.Timestamp")
          .withBinding("org.jooq.impl.DateAsTimestampBinding")
          .withIncludeTypes("DATE")
      )
    )
  )

有关更多详细信息,请参见 配置 XSD程序化代码生成

import org.jooq.meta.jaxb.*


configuration {
  generator {
    database {

      // Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated.
      isDateAsTimestamp = true

      // Define a custom binding for such DATE as TIMESTAMP columns
      forcedTypes {
        forcedType {
          name = "TIMESTAMP"
          userType = "java.sql.Timestamp"
          binding = "org.jooq.impl.DateAsTimestampBinding"
          includeTypes = "DATE"
        }
      }
    }
  }
}

有关更多详细信息,请参见 配置 XSDgradle 代码生成

configuration {
  generator {
    database {

      // Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated.
      dateAsTimestamp = true

      // Define a custom binding for such DATE as TIMESTAMP columns
      forcedTypes {
        forcedType {
          name = "TIMESTAMP"
          userType = "java.sql.Timestamp"
          binding = "org.jooq.impl.DateAsTimestampBinding"
          includeTypes = "DATE"
        }
      }
    }
  }
}

有关更多详细信息,请参见 配置 XSDgradle 代码生成

// The jOOQ-codegen-gradle plugin has been introduced in version 3.19.
// Please use the official plugin instead of the third party plugin that was recommended before.

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo