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

Postgres/jOOQ替换jsonb[]元素

邢高澹
2023-03-14

我有一个带有jOOQ和Postgresql数据库的Spring应用程序,它有一个包含以下两列的表(问题):

id (Long)
documents (jsonb[]) <- array of jsonb (not jsonb array)

文档json结构采用以下格式:

{
   "id": (UUID),
   "name": (String),
   "owner"; (String)
}

我想实现的是能够用一个新文档替换具有匹配id的文档(通常只有一个)。我正在与jOOQ甚至普通SQL作斗争。

我想我需要在jOOQ中编写一些简单的SQL才能做到这一点,但这是可以的(至少)。我有一个想法要做以下事情:

  1. 取消对文档列的测试
  2. 过滤出数组中应更新的文档
  3. 附加应更新的文档
  4. 存储整个阵列

原始SQL看起来像这样,但缺少要添加的新文档:

UPDATE issues SET documents = (SELECT ARRAY_AGG(doc) FROM issues, UNNEST(issues.documents) AS doc WHERE doc->>'id' != 'e4e3422f-83a4-493b-8bf9-37980d532538') WHERE issues.id = 1;

我的最终目标是在jOOQ中编写这篇文章,并附加要替换的文档。我使用的是jOOQ 3.11.4。

共有1个答案

谢宸
2023-03-14

您应该能够在PostgreSQL中连接数组:

UPDATE issues 
SET documents = (
  SELECT ARRAY_AGG(doc) || '{"id":"e4e3422f-83a4-493b-8bf9-37980d532538","name":"n"}'::jsonb
  FROM issues, UNNEST(issues.documents) AS doc 
  WHERE doc->>'id' != 'e4e3422f-83a4-493b-8bf9-37980d532538'
)
WHERE issues.id = 1

一些常见的数组函数将在不久的将来添加到jOOQ中,例如数组连接,但我怀疑您现在可以使用普通的SQL模板吗?

 类似资料:
  • 这相当于在Postgres中测试包含条件。但是我需要做exists条件。我如何在Jooq中表达这一点?

  • 我正试图从JSONB转换为Google GSON JSONElement。我使用的转换器来自:https://www.jooq.org/doc/3.11/manual/code-generation/custom-data-type-bindings/ TableImpl中的列:

  • 我对postgresql(9.4)和javascript有一些问题。我试图将jsonb[]数据类型转换为javascript中json值的数组/列表。为了简单起见,我的示例在数组中只包含一个元素(json)。 以下是我迄今为止尝试过的。 这是我要找的。 任何帮助将不胜感激。

  • 我有下面的Postgres查询,当通过psql客户端运行时可以很好地工作- 然而,当我通过创建org.hibernate.query对象来运行查询时,我得到了一个类似于这样的异常- psqlexception:错误:运算符不存在:jsonb@>字符变化提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。职位:144 请帮帮忙。我读了以下关于创建一个新类型的帖子,并且Hibern

  • 我正在阅读Postgres Jsonb文档,但找不到解决我遇到的一个小问题的方法。 我有一张桌子:MY_TABLE 具有以下列: 用户、名称、数据和购买 需要注意的是,“数据”是一个jsonb,有多个字段。“Data”中的一个字段是“Attribute”,但它可以保存的值不同步。我的意思是,它可以是一个字符串,一个字符串列表,一个空列表,或者只是一个空字符串。然而,我想改变这一点。 我希望允许的唯

  • 我正在调查Jooq,发现了一些我几乎找不到文档的东西——没有一个能完全诚实地回答我的问题。 我想做的是在表中有一列,比如permissions Variable bit(2000)(Postgres 9.5) 然而,Jooq对此所做的是将其视为varchar...这显然是不正确的,即使在一代。在这样的事情上,成功的捷径是什么?