java - 在 Jooq 中使用泛型实现接口(interface)

标签 java generics jooq

我有几十个生成的 JOOQ 表,代表我的 MySQL 数据库中的 View ,所有表都具有匹配的列。我想对这些 View 进行一般操作 - 所以我使用了 generator strategy下面实现保证底层字段的接口(interface):

<strategy>
  <matchers>
    <tables>
      <table>
        <expression>V_.*_TO.*</expression>
        <tableImplements>MyView</tableImplements>
        <recordImplements>MyRecord</recordImplements>
      </table>
    </tables>
  </matchers>
</strategy>

这是我的界面:

public interface MyView<R extends TableRecord> extends Table<R> {
    default TableField<MyRecord, Integer> get_MY_RECORD_COLUMN() {
        return (TableField<MyRecord, Integer>) this.field("my_record_column");
    }
...
}
public interface MyRecord<R extends UpdatableRecord<R>> extends UpdatableRecord<R> {
    public void setMyRecordColumn(Integer value);
...
}

这是 JOOQ 生成的内容:

public class VMyGeneratedView extends TableImpl<VMyGeneratedRecord> implements MyView {
...
}
public class VMyGeneratedRecord extends TableRecordImpl<VMyGeneratedRecord> implements MyRecord, Record8<Integer, Integer, Integer, String, Integer, Integer, Integer, String> {
...
}

我让我的接口(interface)扩展了上面的 TableRecord/Table 来访问底层字段。由于 MyViewTableImpl 都实现了底层 Table,因此它们的通用参数必须匹配(MyRecord 也存在同样的问题)。

只有当我像这样手动编辑时,生成的表格才会起作用:

public class VMyGeneratedView extends TableImpl<VMyGeneratedRecord> implements MyView<VMyGeneratedRecord> {
...
}
public class VMyGeneratedRecord extends TableRecordImpl<VMyGeneratedRecord> implements MyRecord<VMyGeneratedRecord>, Record8<Integer, Integer, Integer, String, Integer, Integer, Integer, String> {
...
}

如何配置 JOOQ 来注入(inject)我需要的泛型?有更好的方法吗?

最佳答案

虽然可以在 XML 配置和隐含泛型之间实现精细的映射(毕竟,如果您声明接口(interface)具有 <R> 类型变量,那么“可能”就是 Record 类型) ,这还没有完成:

  1. 它看起来很脆弱且不完整。很快,就会出现无法覆盖的额外边缘情况,这很快就会变成维护噩梦
  2. 您的界面上可能实际上并不需要泛型类型
  3. 如果您确实这样做,您仍然可以实现 programmatic generator strategy ,您可以完全控制为这些 super 类型生成的确切字符串。

关于 2) 的更多信息,您不需要界面上的泛型类型。只需像这样声明它们:

public interface MyView {
    default Field<Integer> get_MY_RECORD_COLUMN() {
        return (Field<Integer>) this.field("my_record_column");
    }
...
}
public interface MyRecord {
    public void setMyRecordColumn(Integer value);
...
}

这些接口(interface)将混合到您生成的代码中。我认为这对于大多数情况来说应该足够了?

关于java - 在 Jooq 中使用泛型实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75817512/

相关文章:

java - 使用抽象类的ArrayList

java - Oozie shell 操作无法在 Linux 中执行 java

java - 在 JTS 中,当我执行 geometry.buffer(1).buffer(-1) 时,生成的几何是否与原始几何相同?

java - 实现泛型接口(interface)时如何返回具体类型

java - type T 和 Object 有什么区别?

java - JOOq:更新通用表

java - 扩展jooq的行值查询

java - jOOQ 字段<T> = DSL.any(DSL.val(T...))

java - Spring Boot 在 Gradle 中获取包的属性

java - Xpath如何获取带有html标签的文本