JOOQ自动生成的字段的SQLDataType有什么用类

What's the usage of field's SQLDataType in JOOQ's auto generated classes

当通过 JOOQ code gen 生成 JOOQ 类 时,对于每个字段,都会有一个与之关联的 SQLDataType,如下所示。

public final TableField<EventsRecord, LocalDateTime> CREATED_AT = createField(DSL.name("CREATED_AT"), SQLDataType.LOCALDATETIME(6).nullable(false), this, "");

每个生成的字段都有 SQLDataType 的用途或目的是什么?因为我们已经有了一个 return 类型,客户端代码很可能会使用这个类型来进行编译检查。

为什么我们还需要知道生成的 SQLDataType class/fields?

关于客户端类型,您可能指的是 LocalDateTime 类型,即您将在整个 jOOQ API 中找到的 <T> 类型。当然,那是 you 关心的类型,但是 jOOQ 在内部会关心 org.jooq.DataType 。您的示例已经给出了两个可能有用的想法:

  • LOCALDATETIME(6) 上有 6 位小数位的精度,它被使用(除其他外):
    • CAST expressions。试试 DSL.cast(inline("2000-01-01 00:00:00"), EVENTS.CREATED_AT),
    • DDL statements. Try DSLContext.meta(EVENTS)。您应该会看到具有适当数据类型
    • CREATE TABLE 语句
    • 在乐观锁定功能中,以正确的精度创建修改时间戳。
  • 有一个指示列是否可以为空,它被使用(再次除其他外):
    • 在 DDL 语句中,见上文
    • implicit join feature中决定是生成一个INNER JOIN还是一个LEFT JOIN
  • DataType 可以拥有许多其他属性,这对于运行时的 jOOQ 来说很有趣,包括:
    • 自定义数据类型绑定
    • 字符集
    • 排序规则
    • 转换器
    • 默认值
    • 是否是身份
  • 此外,String 不是 String。例如,它可能表示 CHAR(2)CHAR(5)VARCHAR(100)CLOB,这些在某些方言中都是完全不同的意思。

如果您的运行时元模型没有可用的信息,那将是一种耻辱。