Java JOOQ:在公共接口中对来自不同表的列进行逻辑分组
我们有一种表设计,其中许多表共享一些列,例如,在一种情况下,我们的一些表将列Java JOOQ:在公共接口中对来自不同表的列进行逻辑分组,java,sql,jooq,Java,Sql,Jooq,我们有一种表设计,其中许多表共享一些列,例如,在一种情况下,我们的一些表将列标记为deletion。在另一种情况下,我们的多个表具有列approvedAt和approvedBy。这些表在待连接数据方面不共享任何内容,因此,我不想为这些数据引入公共连接表(由于性能问题,这也不是一个选项) 但从应用程序的角度来看,我确实有非常类似的任务要执行。例如,如果我创建了一个新行,在哪个表中插入条目并不重要,我需要从请求中提取审批人和请求时间,将其与代码中稍后的其他行数据一起填入我的表中 在JOOQ中,我现在
标记为deletion
。在另一种情况下,我们的多个表具有列approvedAt
和approvedBy
。这些表在待连接数据方面不共享任何内容,因此,我不想为这些数据引入公共连接表(由于性能问题,这也不是一个选项)
但从应用程序的角度来看,我确实有非常类似的任务要执行。例如,如果我创建了一个新行,在哪个表中插入条目并不重要,我需要从请求中提取审批人和请求时间,将其与代码中稍后的其他行数据一起填入我的表中
在JOOQ中,我现在可以做如下事情
private void insertApprovalInformation(Record record, RequestContext ctx) {
record.set(DSL.field("approver"), ctx.getRequestUser());
record.set(DSL.field("approvedAt"), ctx.getRequestTime());
}
private void insertApprovalInformation(Approvablerecord record, RequestContext ctx) {
record.set(ApprovableTable.APPROVER, ctx.getRequestUser());
record.set(ApprovableTable.APPROVED_AT, ctx.getRequestTime());
}
然而,我将失去所有我心爱的类型安全与该方法。
理想情况下,我想写一些
private void insertApprovalInformation(Record record, RequestContext ctx) {
record.set(DSL.field("approver"), ctx.getRequestUser());
record.set(DSL.field("approvedAt"), ctx.getRequestTime());
}
private void insertApprovalInformation(Approvablerecord record, RequestContext ctx) {
record.set(ApprovableTable.APPROVER, ctx.getRequestUser());
record.set(ApprovableTable.APPROVED_AT, ctx.getRequestTime());
}
我知道这类似于Postgres继承特性,但我希望它更独立于数据库,并希望在Oracle数据库中使用它。我想象一下配置JOOQ生成器并告诉它“这四个表属于一个逻辑组,我将其命名为“approvable”,它们都有APPROVER
和APPROVED\u AT
”列,这将让JOOQ生成类,例如为该组实现标记接口
我认为这可能是在考虑历史化、常见任务(如批准、标记要删除的行等)时经常使用的功能
我的问题是:
- 在JOOQ中是否已经有一种方法可以实现我想要的类型安全结果
- 关于如何以类型安全的方式处理此场景,还有其他建议吗
- 还是我应该忘记这里的类型安全性
public interface Approvable {
void setApprover(String approver);
void setApprovedAt(Timestamp approvedAt);
}
然后配置代码生成器,让所有相关生成的记录使用生成器策略实现上述接口:
。。
我的桌子
com.example.Approvable
是否有一种方法可以生成可在所有可批准的表上使用的公共字段常量,如OP建议的:ApprovableTable.APPROVED\u AT
?@Sebastian:这与OP关于接口的问题相同吗?你的问题似乎是关于“常数”-也许可以问一个新的问题,而不是细节?我很乐意回答。当然!你可以找到它