我正在尝试实现一些应用程序级数据触发器,以取代现有的数据库触发器。这些是由“当字段 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
机制。参见 here和 here有关此的一些注释。
也就是说,jOOQ 也提供了一些选项。正如您所发现的,ExecuteListener
SPI 没有用于遍历 SQL 查询的 API。有计划在未来的版本中解决这个问题,但现在你必须将你的 ExecuteListener
与 VisitListener
结合起来。 .这是一个非常强大的 SPI,但不适合胆小的人,因为它同时非常低级。另见 this blog entry举个例子。
为了完整起见,我还应该提到 jOOQ 的 RecordListener
.如果您只需要使用 UpdatableRecord
所做的更改的通知,这将适用操作。
关于java - 在 JOOQ 的 ExecuteListener 中访问插入/更新 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57270721/