如何扩展 JOOQ 代码生成器?

How can I extend the JOOQ code generator?

我想让我们的 JOOQ 记录更加类型安全。例如,我希望 BIGINT 字段 CUSTOMER.IDORDER.CUSTOMER_ID 的类型为 CustomerNo 而不仅仅是 Long

我可以强制 JOOQ 的代码生成器使用 customType forcedType:

的组合生成正确的字段
public final TableField<CustomerRecord, CustomerNo> ID = 
  createField("ID", SQLDataType.BIGINT.asConvertedDataType(new CustomerNoConverter()), this);

public final TableField<OrderRecord, CustomerNo> CUSTOMER_ID = 
  createField("CUSTOMER_ID", SQLDataType.BIGINT.asConvertedDataType(new CustomerNoConverter()), this);

然而,这还不够。对于 Long 类型的每个单字段主键,我需要创建两个 类,即 CustomerNoCustomerNoConverter 的等价物。当然,最方便的方法是使用 JOOQ 元模型循环遍历任何此类字段并为每个字段生成代码。

由于 JOOQ 模型本身依赖于要生成的 类,我需要连接到 JOOQ 的代码生成器。但是,我无法为这个任务找到合适的回调机制。我该如何解决这个问题?

有一个未决的功能请求 #2574 和一些相关的想法,旨在代码生成器为每个主键/外键元组生成 类,这对于某些附加类型非常有用在表达查询时进行检查。

与此同时,您始终可以扩展 jOOQ 的 JavaGenerator 并向其添加一些额外的 类。例如,有一个 "custom code section" 部分,您可以在其中放置自己的代码。例如,包括您的自定义嵌套 类。输出可能类似于:

public class Customer extends TableImpl<CustomerRecord> {
    public final TableField<CustomerRecord, CustomerNo> ID = 
      createField("ID", SQLDataType.BIGINT.asConvertedDataType(new CustomerNoConverter()), this);
    ...

    // Your additional genererated code here
    public static class CustomerNo {
        public final Long ID;
    }

    public static class CustomerNoConverter implements Converter<Long, CustomerNo> {
        ...
    }
}

然后,不使用 XML 配置,而是使用 programmatic configuration 生成所有自定义类型/强制类型。