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_first
和 jsonb_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。
正在尝试将以下 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_first
和 jsonb_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。