我想让我们的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的代码生成器。但是,我无法为此任务找到合适的回调机制。我怎么能解决这个问题?
答案 0 :(得分:1)
有一个待处理的功能请求#2574和一些相关的想法,它们针对代码生成器为每个主键/外键元组生成类,这对于表达查询时的某些其他类型检查非常有用。 / p>
与此同时,您可以随时扩展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> {
...
}
}
然后,使用programmatic configuration生成所有customTypes / forcedTypes,而不是使用XML配置。