如何从 SQL 查询配置 jOOQ 可嵌入类型

Posted

技术标签:

【中文标题】如何从 SQL 查询配置 jOOQ 可嵌入类型【英文标题】:How to configure jOOQ Embeddable Types from SQL Query 【发布时间】:2021-12-17 18:21:54 【问题描述】:

我们有一个数据库,其中有很多嵌入式类型。通常相同的嵌入类型在同一个表中出现多次。各个列都遵循命名模式,因此可以使用 SQL 查询等轻松识别不同的出现。

配置 jOOQ 以便这些嵌入类型被代码生成器映射的最佳方式是什么?请注意,我们的真实数据库包含数百个表,因此手动配置是不行的。

虚构的例子:

create table t(amount int, unit varchar2(4), amount_pend int, unit_pend varchar(4));

【问题讨论】:

【参考方案1】:

每个表多次重复使用相同的嵌入

从 jOOQ 3.15 开始,每个表还不能多次引用相同的可嵌入类型。您只能从多个表中引用它,每个表一次。

这显然应该得到解决。这似乎只是代码生成限制。我为此创建了一个功能请求: https://github.com/jOOQ/jOOQ/issues/12608

从 jOOQ 3.17 开始,您可以声明:

<embeddables>
    <embeddable>
        <name>MONETARY_AMOUNT</name>
        <referencingName>AMOUNT_WITH_UNIT</referencingName>
        <tables>T/tables>
        <fields>
            <field><expression>AMOUNT</expression></field>
            <field><expression>UNIT</expression></field>
        </fields>
    </embeddable>
    <embeddable>
        <name>MONETARY_AMOUNT</name>
        <referencingName>AMOUNT_WITH_UNIT_PEND</referencingName>
        <tables>T/tables>
        <fields>
            <field><name>AMOUNT</name><expression>AMOUNT_PEND</expression></field>
            <field><name>UNIT</name><expression>UNIT_PEND</expression></field>
        </fields>
    </embeddable>
</embeddables>

目前,您必须生成 2 种不同的可嵌入类型,它们在名称或类型上不兼容,仅在结构上兼容。

动态生成代码生成配置

代码生成配置是一个带有 JAXB 注释的 API,恰好可以方便地映射到:

马文:https://www.jooq.org/doc/latest/manual/code-generation/codegen-maven/ 此 XSD(或更新版本)之后的独立 XML 文件:https://www.jooq.org/xsd/jooq-codegen-3.16.0.xsd

但您也可以自己以编程方式使用代码生成 API,从而动态生成配置元素:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-programmatic/ 或者,由于它都是基于 XML 的,您可以使用 XSLT 来生成配置

【讨论】:

谢谢。我会从这里关注这个问题。

以上是关于如何从 SQL 查询配置 jOOQ 可嵌入类型的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ:如何在选择查询中调用 Sql 用户定义函数

SQL 方言如何在 hibernate 和 JOOQ 等框架内部实际工作

如何使用 Spring-Boot config 配置 JOOQ 设置?

执行前重建查询

如何从具有执行类型作为嵌入式查询的 Control-M 数据库作业运行 SQL Developer 中存在的存储过程

如何使用 Gradle 和 Mysql 为单个数据库配置 jooq