【问题标题】:JOOQ: how do I add an interface to a generated Record ClassJOOQ:如何向生成的记录类添加接口
【发布时间】:2016-01-05 09:26:31
【问题描述】:

我正在使用 JOOQ 3.6.4 和 Java 8 从架构生成一组 JOOQ 记录。

有些表是结构相似的参考数据,假设它们有 ID、CODE 和 VALUE 列(它们可能有其他列,但它们都至少有这些列)。

在我的代码中,不是由 JOOQ 生成的,我有一个接口“ReferenceData”,它定义了与 JOOQ 为这三列生成的代码相匹配的访问器。我想告诉 JOOQ 在它生成的 Record 对象中添加一个"implements ReferenceData" 子句(JOOQ 已经生成的代码将自动实现接口)。

我不是要求 JOOQ 自动找出接口,我可以列出每个表应该在 XML 配置中实现的接口。

问题 1:有没有办法配置 JOOQ 以在不编写自定义生成器类的情况下生成 implements 子句?

如果我必须编写一个自定义生成器类 - 我仍然想要定义哪些表记录实现了 XML 配置中的哪些接口。

问题 2:是否有在 XML 中定义自定义数据并向下传递到自定义生成器类的示例?

【问题讨论】:

    标签: java sql code-generation jooq


    【解决方案1】:

    这可以使用

    生成器策略

    使用生成器策略,您将实现以下代码:

    public class MyStrategy extends DefaultGeneratorStrategy {
        @Override
        public List<String> getJavaClassImplements(Definition definition, Mode mode) {
            if (mode == Mode.RECORD && definition.getQualifiedName().matches("some regex")) {
                return Arrays.asList(MyCustomInterface.class.getName());
            }
        }
    }
    

    然后可以像这样将上述内容挂接到您的代码生成器配置中:

    <generator>
      <strategy>
        <name>com.example.MyStrategy</name>
      </strategy>
    </generator>
    

    匹配策略

    使用匹配器策略,您基本上可以编写:

    <generator>
      <strategy>
        <matchers>
          <tables>
            <table>
              <expression>A_REGEX_MATCHING_ALL_RELEVANT_TABLES</expression>
              <recordImplements>com.example.MyCustomInterface</recordImplements>
            </table>
          </tables>
        </matchers>
      </strategy>
    </generator>
    

    如您所见,对于像您这样的简单用例,匹配器策略比生成器策略更容易配置。

    【讨论】:

    • 是的,Matcher 策略效果很好,谢谢。但是使用生成器策略,是否可以在 XML 配置中定义“一些正则表达式”部分,这样它就不会在策略类中硬编码?
    • @Shorn:不,这不可能开箱即用。虽然,您可以将系统属性传递给代码生成器并读取它们...
    • 我可以从 Gradle 中以某种方式使用它吗?
    • @AdamArold:是的,请使用这个:github.com/etiennestuder/gradle-jooq-plugin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2023-04-11
    • 2016-09-04
    • 1970-01-01
    • 2018-02-18
    • 2014-03-19
    • 2020-04-14
    相关资源
    最近更新 更多