当前位置: 首页 > 知识库问答 >
问题:

如何返回触发器为JOOQ记录存储创建的值?

葛奇
2023-03-14

几周以来,我们使用JOOQ作为我们的主要持久性框架,而不是所有的Spring Data JPA/Hibernate之类的东西。我真的印象深刻!!!

对于简单的积垢操作,我们使用record。store()而此记录是一个可更新的RecordImpl,因为基础表包含一个ID(列ID,PostgreSQL类型为串行),此外,JOOQ配置了和ReturnAllonUpdateRecord(true),并且我们的表包含一个用于生成列值的触发器努默:

CREATE OR REPLACE FUNCTION "public"."after_insert_angebot" () RETURNS trigger
VOLATILE
AS $body$
DECLARE
BEGIN
UPDATE kalkulation_angebot SET nummer = date_part('year', CURRENT_DATE) || '-' || LPAD(NEW.id::text, 3, '0') WHERE id = NEW.id;
RETURN NEW;
END;
$body$ LANGUAGE plpgsql

CREATE TRIGGER "after_insert_angebot"
  AFTER INSERT ON kalkulation_angebot
  FOR EACH ROW
EXECUTE PROCEDURE after_insert_angebot()

我期望,之后record.store()和由于with ResnAllOnUp数据库记录(true)记录包含id(由列类型生成)和Nummer(由触发器生成)的值。但只填充了id。我必须通过一个额外的查询手动设置Nummer

// jooq fetched the new values and the id is available
Integer angebotId = record.getId();

// ... but nummer is missing and has to set manually
angebot.setNummer(jooq.select(KALKULATION_ANGEBOT.NUMMER)
        .from(KALKULATION_ANGEBOT)
        .where(KALKULATION_ANGEBOT.ID.eq(record.getId()))
        .fetchSingleInto(String.class));

我假设,错误在触发函数内?如何触发应该,以履行留档的promise:

标识值不是默认情况下生成的唯一值。具体而言,可能存在用于[…]的触发器希望在所有store()、insert()或update()调用之后自动获取这些值的用户可以通过指定ReturnAllonUpDataableRecord设置来实现

提前感谢
Dominik

共有1个答案

罗智志
2023-03-14

使用ReturnAllonUpdateRecord(true)设置生成一个插入。。正在返回更新。。返回jOOQ中的语句。由于您已在INSERT触发器后定义了,因此这无助于返回您可能期望的值。在香草PostgreSQL中尝试:

CREATE TABLE kalkulation_angebot (
  id serial,
  nummer text
);

-- Your own TRIGGER below:
CREATE OR REPLACE FUNCTION "public"."after_insert_angebot" () RETURNS trigger
VOLATILE
AS $body$
BEGIN
  UPDATE kalkulation_angebot 
  SET nummer = date_part('year', CURRENT_DATE) || '-' || LPAD(NEW.id::text, 3, '0')
  WHERE id = NEW.id;
  RETURN NEW;
END;
$body$ LANGUAGE plpgsql;

CREATE TRIGGER "after_insert_angebot"
  AFTER INSERT ON kalkulation_angebot
  FOR EACH ROW EXECUTE PROCEDURE after_insert_angebot();

INSERT INTO kalkulation_angebot DEFAULT VALUES RETURNING *;

输出为:

|id         |nummer  |
|-----------|--------|
|1          |        |

把你的触发器换成我认为更有意义的东西怎么样:

CREATE OR REPLACE FUNCTION "public"."before_insert_angebot" () RETURNS trigger
VOLATILE
AS $body$
BEGIN
  NEW.nummer = date_part('year', CURRENT_DATE) || '-' || LPAD(NEW.id::text, 3, '0');
  RETURN NEW;
END;
$body$ LANGUAGE plpgsql;

CREATE TRIGGER "before_insert_angebot"
  BEFORE INSERT ON kalkulation_angebot
  FOR EACH ROW EXECUTE PROCEDURE before_insert_angebot();

INSERT INTO kalkulation_angebot DEFAULT VALUES RETURNING *;

现在输出为:

|id         |nummer  |
|-----------|--------|
|1          |2020-001|

 类似资料:
  • 本文向大家介绍MySQL如何创建触发器,包括了MySQL如何创建触发器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了MySQL创建触发器的具体代码,供大家参考,具体内容如下 先来个实例: 实例解析:   先创建触发器中待存储的表t_attendance   DELIMITER $   意思是告诉mysql下文执行语句以“$”结束,如果没有这句,下面语句会出错,mysql无法判断哪句

  • 我有以下记录是通过一个带有几个连接的查询得到的: 现在,当我尝试检索不在结果中的特定列时: 其中生成具有以下详细信息的静态编程语言代码: 我希望得到null。但是,返回了错误的id值(zkn_zaak.id)。 我错过了什么?jOOQ不应该有足够的信息(表和字段名)来从记录中检索正确的列吗? =======更新============= 从代码来看,这似乎是预期的行为,并且已经在例如。https:

  • 问题内容: 我正在尝试创建一个存储的proc,它返回所有已更新的记录。 我的更新查询是这样的: 我只是不确定如何返回这些特定记录。 问题答案: 您可以用来获取语句已修改的行。 例子;

  • 主要内容:基本语法,创建 BEFORE 类型触发器,创建 AFTER 类型触发器触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。 基本语法 在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。 语法格式如下: CREATE <触发器名> < BEFORE | AFTER > <INSERT | UPDATE | DELETE > ON <

  • 进入函数详情页,点击“触发器”标签,展示当前函数配置的触发器,点击“创建新触发器”,选择HttpTrigger,填写对应信息。 路径映射必须以“/”开头,可以选择以GET或POST方法触发函数。 创建触发器后,触发器详情页面可对触发器进行修改及删除的操作,点击下图所示图标,可以获得HTTPS URL,通过该URL在浏览器或终端直接访问,触发Hello World函数。

  • 问题内容: mysql有什么方法可以在创建时自动将时间戳存储在记录行中。我试图将timestamp(数据类型)与current_timestamp用作默认值,但后来意识到,每当记录更新时,它将更新。我只需要一些可以存储创建时间戳记的东西。 谢谢 问题答案: 设置DEFAULT约束以使用CURRENT_TIMESTAMP: 对于现有表,请使用ALTER TABLE语句: 除非您为date_colum