使用JOOQ从表中生成枚举类

Phi*_*lip 8 java mysql enums jooq

我有下表YNM:

 id  name
 1   YES
 2   NO 
 3   MAYBE
Run Code Online (Sandbox Code Playgroud)

并希望JOOQ生成以下java枚举:

public enum YNM {
   YES,NO,MAYBE;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,由于过于复杂/反直觉,因此在JOOQ 3中删除了对此的支持.有没有办法实现这个目标?

提前致谢.

Bil*_*eil 5

我认为你应该能够使用 EnumConverter

public class YNMConverter extends EnumConverter<String, YNM > {

    public YNMConverter() {
        super(String.class, YNM.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要将它作为自定义类型和强制类型添加到代码生成器中。这是一个程序示例

new CustomType()
.withName("YNM")
.withType(YNM.class.getName())
.withConverter(YNMConverter.class.getName());

new ForcedType()
.withTypes("varchar")
.withName("YNM")
.withExpression(".*ynm.*") // regex to match the column name
Run Code Online (Sandbox Code Playgroud)

您需要将强制类型和自定义类型添加到代码生成中。这可以在 maven/xml 或以编程方式完成

  • 是否有一个 github 示例说明如何在 maven/xml 中执行此操作,以便所有配置和所有内容都位于一个位置?我发现很多人这样做或那样做,但它们只是一些片段,没有完整的解决方案可供查看。如果您知道一个例子,我们将不胜感激。 (2认同)

Luk*_*der 5

当然,您可以通过几个步骤在您身边重新实现已删除的功能:

1. 为该枚举实现生成器

您需要覆盖JavaGenerator以实现将主数据(可能是多个表)转换为枚举的代码生成。如何工作完全取决于您,例如您可以:

  • 单列主数据表
  • ID/VALUE 映射表
  • ID/VALUE/评论映射表
  • 其他布局

2.ForcedType为这些枚举生成配置

每当引用这样的主数据表时,您应该使用<forcedType/>配置将外键列重新连接到该枚举。这最好通过以编程方式配置代码生成来完成,因为这样可以让您对 jOOQ 代码生成配置有更多的动态控制。

此步骤在 Bill O'Neil 的回答中有更详细的记录

3. 防止主数据表的生成

除了上述内容之外,您可能应该从生成的输出中删除主数据表本身。在您的情况下,这应该导致配置:

<excludes>YNM</excludes>
Run Code Online (Sandbox Code Playgroud)

或者,如果您有多个主数据表:

<excludes>YNM|OTHER_MASTER_DATA_TABLE|...</excludes>
Run Code Online (Sandbox Code Playgroud)

排除这些表将阻止从 jOOQ 客户端代码访问它们,并删除生成代码中的外键信息,这可能会造成混淆。