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

2024-01-27

我们有一个表设计,其中许多表共享一些列,例如在一种情况下,我们的一些表具有该列markedForDeletion。在另一种情况下,我们的多个表都有列approvedAt and 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());
}

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

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

我的问题:

  • JOOQ 中是否已经有一种方法可以实现我想要的类型安全结果?
  • 关于如何以类型安全的方式处理这种情况还有其他建议吗?
  • 或者我应该忘记这里的类型安全?

使用 jOOQ 3.14 中的嵌入式

jOOQ 3.14 推出“可嵌入类型” https://www.jooq.org/doc/latest/manual/code-generation/codegen-embeddable-types/,在代码生成器的基础上彻底解决了这个问题。您可以像这样定义一个嵌入:

<configuration>
  <generator>
    <database>
      <embeddables>
        <embeddable>
          <name>APPROVAL_INFORMATION</name>
          <fields>
            <field><expression>APPROVER</expression></field>
            <field><expression>APPROVED_AT</expression></field>
          </fields>
        </embeddable>
      </embeddables>
    </database>
  </generator>
</configuration>

(可以进行更具体的配置,详细信息请参阅手册 https://www.jooq.org/doc/latest/manual/code-generation/codegen-embeddable-types/)。现在这将生成一个辅助EmbeddableRecord为您提供以下形式:

public class ApprovalInformationRecord
extends EmbeddableRecordImpl<ApprovalInformationRecord> {
    public ApprovalInformationRecord(
        String approver, LocalDateTime approvedAt
    ) { /* ... */ }
    
    // Getters, setters
}

您可以在查询、投影等中使用此嵌入项代替基础列。

Result<Record2<Long, ApprovalInformationRecord>> result =
ctx.select(T.ID, T.APPROVAL_INFORMATION)
   .from(T)
   .where(T.APPROVAL_INFORMATION.eq(new ApprovalInformationRecord(...))
   .fetch();

使用自定义接口的通用解决方案

您可以轻松配置和扩展 jOOQ 代码生成器来为您添加类型信息。由于您想要处理生成的记录,只需将如下所示的新接口添加到您的代码库中:

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

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

  • 程序化 https://www.jooq.org/doc/latest/manual/code-generation/codegen-generatorstrategy/
  • 配置性 https://www.jooq.org/doc/latest/manual/code-generation/codegen-matcherstrategy/

一个配置示例:

..
<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>MY_TABLE</expression>
          <recordImplements>com.example.Approvable</recordImplements>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JOOQ:在公共接口中对来自不同表的列进行逻辑分组 的相关文章

  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 如何知道int*数组的结尾?

    我正在制作一个动态数组int 数据类型使用malloc 但问题是 如何知道数组结束呢 没有相当于 0 for int 数据类型 那么 如何做到这一点呢 将大小作为函数的输出参数传递 C 不像其他一些语言那样管理数组长度 你可以考虑一个结构
  • iOS 配置文件未安装在一台特定设备上

    我最近分发了一个用于测试的应用程序 测试团队在安装该应用程序时遇到了问题 更具体地说是与该应用程序关联的配置文件 他们使用的是 iPhone 4 iOS 5 1 1 并收到 由于未知错误而无法安装配置文件 我习惯于在尝试安装的配置文件中未注
  • Java 8:为什么我无法将此二进制字符串解析为 long?

    长话短说 我正在用 Java 搞一些基本的遗传算法 我当时用的是long存储我的基因 但我在调试时使用二进制字符串以提高可读性 我遇到了一个奇怪的情况 我无法解析一些以 a 开头的二进制字符串1 我不知道是否总是如此 但似乎与长度为 64
  • 引导程序中的填充

    我使用引导程序 div class container div class row div class span6 h2 Welcome h2 p Hello and welcome to my website p div div clas
  • 我正在尝试使用 JDBC 从 Oracle 表中提取 XMLTYPE 列,但遇到一些问题

    我正在尝试使用 JDBC 从 Oracle 表中提取 XMLTYPE 列 我有疑问 select XML FILE FROM TABLE NAME 当我在 Oracle SQL Developer 中运行查询时 它完全正常地返回所有 XML
  • 如何在窗口关闭时设置断点或阻止开发人员工具窗口关闭?

    我在 FireFox 弹出窗口的单独窗口中打开了开发人员工具 问题是 表单提交后 该弹出窗口会由 JavaScript 自动关闭 并且我无法禁用 JavaScript 本身 因为它需要 JavaScript 来提交表单 我搜索了一种在窗口关
  • 如何将 GGRAPH 包安装到最新的 R (v.3.3.2)

    我对 R 非常陌生 我需要 ggraph 库 但无法从 rstudio 控制台安装它 这是一条消息 install packages 中的警告 包 ggraph 不可用 对于 R 版本 3 3 2 还有其他安装方式吗 看起来这个图书馆仍然存
  • 查询拦截 - 处置诊断侦听器

    我们正在使用DiagnosticListeners以便修改 EF Core 生成的 SQL 命令文本 问题是我们的侦听器需要根据通过 HttpRequests 进入我们的 Api 的一些用户特定数据来修改 SQL 命令 我们当前的解决方案非
  • 通用枚举 JPA AttributeConverter 实现

    我试图解决的问题 我正在尝试为 Hibernate 实现枚举映射 到目前为止 我已经研究了可用的选项 并且 Enumerated EnumType ORDINAL and Enumerated EnumType STRING 似乎不足以满足
  • 在两个js文件之间共享全局变量

    我正在使用两个 js 文件并在钛应用程序中在它们之间共享变量 在我的主 app js 中 我有 3 个与表中每一行关联的变量 我有一个事件侦听器 用于单击一行打开模态视图 该视图的组件位于单独的 js 文件中 我的三个变量如下 在单击事件中
  • 检索 id 1 的 Avro 模式时出错,未找到主题。;错误代码:40401

    Caused by org apache kafka common errors SerializationException Error retrieving Avro schema for id 1 Caused by io confl
  • 没有 STB_GNU_UNIQUE 的静态链接 stdc++ 在 dlclose 时导致内存泄漏

    我必须制作一个 dso 静态链接 stdc 并且需要可以从内存动态卸载 所以我尝试编译 gcc disable gnu unique object并使用黄金链接 Wl no gnu unique选项 但两者都包含内存泄漏问题 即使我除了调用
  • Android中的MVC架构[重复]

    这个问题在这里已经有答案了 可能的重复 Android 中的 MVC 模式 https stackoverflow com questions 2925054 mvc pattern in android 我想关注MVC架构 in Andr
  • 为什么要使用双重检查锁定?

    我继续运行使用双重检查锁定的代码 但我仍然对为什么使用它感到困惑 我一开始并不知道双重检查锁定被破坏 http www cs umd edu pugh java memoryModel DoubleCheckedLocking html 当
  • 如何增加 ASP.NET Core 2.0 API 的 Azure 应用服务超时

    我有一个 ASP NET Core 2 0 API 正在部署到 Azure 应用服务 这一直工作得很好 直到最近我不得不处理一个需要超过 2 分钟才能完成的请求 并且我得到了 502 Bad Gateway 说明 The specified
  • 如何使用 LINQ 组合 2 个列表?

    环境 NET4 C Hi All 我想合并这两个列表 A B C D and 1 2 3 进入这个 A1 A2 A3 B1 B2 B3 C1 C2 C3 D1 D2 D3 显然 我可以使用嵌套循环 但我想知道 LINQ 是否可以提供帮助 据
  • 在 MySQL 中选择表名作为 UNION select 查询中的列

    我希望能够选择行所在的表的名称作为联合选择查询中的列 像这样的东西 SELECT TABLENAME text from table1 UNION SELECT TABLENAME text from table2 ORDER BY dat
  • 评估 CSS 选择器 LTR 或 RTL 是否更容易/更快?

    给定一个 CSS 选择器 例如 ul gt li a 从左到右或从右到左评估它会更容易 更快吗 我意识到 简单 和 更快 的答案可能不同 我想要两者的答案 我即将踏上其中一条道路 但我不想走到一半 然后意识到我选择了错误的道路 LTR 遍历
  • 事务存储过程 C#

    我有一个小问题 请指导我 我正在使用 C 控制台应用程序 进行编码 我在代码中调用了 2 个不同的存储过程 基本上这两个存储过程都访问同一个表 第一个 SP 有一个选择查询和一个更新查询 第二个 SP 有一个更新查询 现在我想以事务模式调用
  • JOOQ:在公共接口中对来自不同表的列进行逻辑分组

    我们有一个表设计 其中许多表共享一些列 例如在一种情况下 我们的一些表具有该列markedForDeletion 在另一种情况下 我们的多个表都有列approvedAt and approvedBy 这些表在连接数据方面不共享任何内容 因此