JOOQ JsonbValue 在 where()

JOOQ JsonbValue in where()

正在尝试将以下 Postgres 查询转换为 Jooq。我很想用 JOOQ 的功能来实现这个,而不是仅仅复制 SQL in.

最终我试图在 jooq 中进行此查询。

SELECT * from content_block cb 
JOIN content_block_data cbd on cbd.block_id  = cb.id 
WHERE cbd."data" @? '$.** ? (@.blockId == 120)';

类似查询的另一个实例

SELECT *
FROM content_block_data
WHERE jsonb_path_query_first(data, '$.**.blockId') @> '120';

类似查询的另一个实例

SELECT *
FROM content_block_data
WHERE jsonb_path_exists(data, '$.** ? (@.blockId == 120)');

我有什么 java

    @NotNull 
Result<Record> parentBlockRecords =
        dslContext.select(asterisk()).from(CONTENT_BLOCK_DATA
            .join(CONTENT_BLOCK).on(CONTENT_BLOCK.ID.eq(CONTENT_BLOCK_DATA.BLOCK_ID)))
            //.where(jsonbValue(CONTENT_BLOCK_DATA.DATA,"$.**.blockId").toString()
             //   .contains(String.valueOf(blockId)))
            .fetch();

我很难上班的地方。查询可以从数据库中获取数据,但是在比较时遇到了一些麻烦。

以及CONTENT_BLOCK_DATA.DATA

中数据的想法
{
  "blocks": [
    {
      "blockId": 120,
      "__source": "block"
    },
    {
      "blockId": 122,
      "__source": "block"
    }
  ]
}

感谢您的帮助。

您正在寻找 Jooq 的 jsonValue and jsonExists,它对应于 PostgreSQL 的 jsonb_path_query_firstjsonb_path_exists.

另请注意,@? 运算符等效于设置了 silent 标志的 jsonb_path_exists 函数。请参阅 JSON operator table in the PostgreSQL documentation.

后的注释

对于您的第一个示例,您将使用以下内容:

  .join(/* */)
  .where(jsonExists(CONTENT_BLOCK_DATA.DATA, "$.** ? (@.blockId == 120)"))
  .fetch();

对于第二个示例,我找不到对应于 @> jsonb 包含运算符的 Jooq DSL 符号,因此您可能不得不回退到 plain SQL in JOOQ,如下所示:

// Second example
  .from(/* */)
  .where(condition("{0} @> {1}",
    jsonValue(CONTENT_BLOCK_DATA.DATA, "$.**.blockId"),
    JSONB.valueOf(120)));
  .fetch();

基于此处提供的解决方案:https://github.com/jOOQ/jOOQ/issues/13125