JOOQ自动生成的类中字段的SQLDataType有啥用

Posted

技术标签:

【中文标题】JOOQ自动生成的类中字段的SQLDataType有啥用【英文标题】:What's the usage of field's SQLDataType in JOOQ's auto generated classesJOOQ自动生成的类中字段的SQLDataType有什么用 【发布时间】:2021-02-23 13:07:41 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于JOOQ自动生成的类中字段的SQLDataType有啥用的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 代码生成器跳过包含 JsonNode 字段的类

使用 jOOQ 创建具有主键的表

JOOQ 类中的布尔字段未由 Jackson/RestEasy 一致地序列化和反序列化

JOOQ + JPA 实体

无法解析 jOOQ 生成的类 TableOptions

为啥在 XSD 中定义为属性时,自动生成的类中的字段会序列化为元素?