如何扩展 JOOQ 代码生成器?
How can I extend the JOOQ code generator?
我想让我们的 JOOQ 记录更加类型安全。例如,我希望 BIGINT
字段 CUSTOMER.ID
和 ORDER.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
类型的每个单字段主键,我需要创建两个 类,即 CustomerNo
和 CustomerNoConverter
的等价物。当然,最方便的方法是使用 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 生成所有自定义类型/强制类型。
我想让我们的 JOOQ 记录更加类型安全。例如,我希望 BIGINT
字段 CUSTOMER.ID
和 ORDER.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
类型的每个单字段主键,我需要创建两个 类,即 CustomerNo
和 CustomerNoConverter
的等价物。当然,最方便的方法是使用 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 生成所有自定义类型/强制类型。