JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型

Posted

技术标签:

【中文标题】JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型【英文标题】:JOOQ forcedType unable to generate NUMERIC SQL data type via JPADatabase code gen 【发布时间】:2021-02-20 07:38:36 【问题描述】:

我正在使用 JPADatabase 从我现有的 JPA 实体生成 JOOQ 类。从手册中,我知道 JPADatabase 内部使用 H2 数据库来读取元数据模式并生成代码。 由于 H2 数据库没有 Numeric 的数据类型,而是具有 Decimal。因此,我所有的数字数据类型都转换为 SQLDataType.DECIMAL。

public final TableField<MyTableRecord, BigDecimal> NUM_FIELD = createField(DSL.name("NUM_FIELD"), SQLDataType.DECIMAL, this, "");

我什至尝试在运行代码生成时使用强制类型强制生成 SQLDataType.NUMERIC,但结果仍然显示 SQLDataType.DECIMAL。而且我发现它甚至适用于 Double,如果我将 SQLDataType.DOUBLE 放在强制类型中,但不适用于 SQLDataType.NUMERIC。

<forcedTypes>
                    <forcedType>
                      <name>NUMERIC</name>
                      <includeExpression>.*\.num_field</includeExpression>
                      <includeTypes>.*</includeTypes>
                      <nullability>ALL</nullability>
                      <objectType>ALL</objectType>
                    </forcedType>
                  </forcedTypes>

有没有办法让 JPADatabase 代码生成 SQLDataType.NUMERIC?

【问题讨论】:

【参考方案1】:

在大多数方言中,DECIMALNUMERIC 之间的区别并不重要,尤其是当您从预先存在的 DDL 语句生成客户端代码时。绑定DECIMALNUMERIC类型变量的客户端逻辑在jOOQ中几乎相同。

可能未应用您的强制类型的原因是正则表达式区分大小写。正如您生成的代码所示,该列名为NUM_FIELD(大写)。解决此问题的一种方法是使您的正则表达式不区分大小写:

<includeExpression>(?i:.*\.num_field)</includeExpression>

【讨论】:

您好 Lukas,感谢您的回答。这真的很有帮助。我想知道的另一件事是每个生成的字段都有 SQLDataType 的用途或目的是什么?由于我们已经有了一个返回类型并且客户端代码很可能使用这个类型来进行编译检查。为什么我们仍然需要知道生成的类/字段中的实际 SQLDataType? @ChrisLee:我很乐意作为一个新问题来回答这个问题 没问题。我在这里问问题***.com/questions/64788481/…

以上是关于JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Jooq 强制类型未应用于列

JOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES

PostgreSQL 函数 + 在 jOOQ 中强制转换

如何使用 jOOQ 通过 SQLite 正确生成日期和时间类型

JOOQ r2dbc 获取数据:无法解码具有 OID 51968 的 java.lang.String 类型的值

SQLite 无法通过 JDBC 和 jOOQ 在 SELECT 中找到现有列