1

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

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

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

为什么我们仍然需要知道生成的类/字段中的实际 SQLDataType?

4

1 回答 1

0

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

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

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

于 2020-11-11T15:34:03.950 回答