gpt4 book ai didi

java - 如何扩展 JOOQ 代码生成器?

转载 作者:行者123 更新时间:2023-11-30 10:55:56 61 4
gpt4 key购买 nike

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

我可以使用 customType forcedType 的组合强制 JOOQ 的代码生成器生成正确的字段:

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生成所有 customTypes/forcedTypes。

关于java - 如何扩展 JOOQ 代码生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33174618/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com