java - 在 JOOQ 的 ExecuteListener 中访问插入/更新 map

标签 java postgresql jooq

我正在尝试实现一些应用程序级数据触发器,以取代现有的数据库触发器。这些是由“当字段 F1 在表 T1 中更新时执行 X”定义的非常简单的触发器。我将 JOOQ 用于持久层,触发器实现为 ExecuteListener .

我正在覆盖 executeEnd(),并从上下文中获取 Query 对象。我可以看到实现 - UpdateQueryImpl(用于更新)有一个非常方便的 updateMap,我可能会检查它以找出哪些字段已更改以及新值是什么。但是我找不到任何公共(public)方法来访问它。

当然,我可以尝试解析 SQL 字符串,但这似乎更容易出错。出于所有显而易见的原因,我尽量避免使用反射,除非我真的必须这样做。

还有其他想法吗?

我用的是Jooq 3.10.8版本,数据库是postgres 9.6

最佳答案

一般来说,数据库服务器功能通常应该优先于客户端功能。在触发器的情况下,例如,您总是有可能错过对给定表的 UPDATE。例如。如果你有一个使用纯 SQL 的 jOOQ 查询,另一个使用纯 JDBC 或 JPA 的应用程序,或一些 SQL 脚本(例如迁移),或由 MERGE 等触发的更新。

如果您不想使用触发器,您也可以使用 PostgreSQL 的 NOTIFY 机制。参见 herehere有关此的一些注释。

也就是说,jOOQ 也提供了一些选项。正如您所发现的,ExecuteListener SPI 没有用于遍历 SQL 查询的 API。有计划在未来的版本中解决这个问题,但现在你必须将你的 ExecuteListenerVisitListener 结合起来。 .这是一个非常强大的 SPI,但不适合胆小的人,因为它同时非常低级。另见 this blog entry举个例子。

为了完整起见,我还应该提到 jOOQ 的 RecordListener .如果您只需要使用 UpdatableRecord 所做的更改的通知,这将适用操作。

关于java - 在 JOOQ 的 ExecuteListener 中访问插入/更新 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57270721/

相关文章:

postgresql - 将 PostgreSQL 安装到 asp.net core 容器中

sql - PostgreSQL:如何从函数内部设置 search_path?

spring - 如何在您的配置中修复 "Consider defining a bean of type ' org.jooq.DSLContext'。”更新到 jOOQ 3.15.0 后

java - 无法在 JOOQ 中设置引用麦粒肿 (RenderNameStyle.QUOTED)

java - 如何根据 HTML 为输入元素构建 CSS 选择器

java - Azure VM 上 Tomcat 7 上的 SSL

postgresql - 如何调整我的 Postgres 服务器?

sql - jOOQ 中的列大小

java - sqlite DB 内带方括号的数据

java - 如何增加使用 for 循环创建的 jlabel 变量名称?