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 中找到的 <T>
类型。当然,这是 你 关心的类型,但 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有啥用的主要内容,如果未能解决你的问题,请参考以下文章