admin

JOOQ:在逻辑上对来自公共界面中不同表的列进行分组

sql

我们有一个表设计,其中许多表共享一些列,例如,在某些情况下,我们的某些表具有column
markedForDeletion。在另一种情况下,我们的多个表都有列approvedAtapprovedBy。这些表不共享任何要成为JOINED数据的内容,因此,我不想为这些表引入一个公共的JOIN表(由于性能问题,这也不是一种选择)。

但是从应用程序的角度来看,我确实有非常相似的任务要执行。例如,如果我创建一个新行,那么在哪个表中插入条目都没关系,我需要从请求中提取批准者和请求时间,以将其与其他行一起填充到我的表中数据稍后在我的代码中。

在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());
}

我知道这类似于Postgres继承功能,但是我想使这个数据库更独立,并希望在Oracle数据库中使用它。我想像是配置JOOQ生成器,然后告诉它“这四个表属于一个逻辑组,我将其命名为“
approvable”,并且它们都有列APPROVERAPPROVED_AT。” 这将使JOOQ生成类,例如为该组实现标记接口。

我认为这在考虑历史化,批准等常见任务,将行标记为删除等时可能是一个相当常用的功能。

我的问题:

  • 我想在JOOQ中已经有一种方法来实现类型安全的结果吗?
  • 关于如何以一种类型安全的方式处理此方案的其他建议?
  • 还是我应该忘记这里的类型安全性?

阅读 149

收藏
2021-06-07

共1个答案

admin

您可以轻松配置和扩展jOOQ代码生成器以为您添加类型信息。由于您要处理生成的记录,因此只需在代码库中添加一个这样的新接口即可:

public interface Approvable {
    void setApprover(String approver);
    void setApprovedAt(Timestamp approvedAt);
}

然后配置代码生成器,以使用生成器策略让所有相关的生成记录实现上述接口:

一个配置示例:

..
<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>MY_TABLE</expression>
          <recordImplements>com.example.Approvable</recordImplements>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>
2021-06-07