我有几十个生成的 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
来访问底层字段。由于 MyView
和 TableImpl
都实现了底层 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
类型) ,这还没有完成:
- 它看起来很脆弱且不完整。很快,就会出现无法覆盖的额外边缘情况,这很快就会变成维护噩梦
- 您的界面上可能实际上并不需要泛型类型
- 如果您确实这样做,您仍然可以实现 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/