postgresql 按JSONB字段值搜索,如何使用jooq正确准备查询?

qjp7pelc  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(159)

我试图从jsonb字段(数组)中按条件查找记录。我使用了jsonb_exists_all函数。我写了一个可以工作的SQL,但是我遇到了用参数绑定创建正确的Java代码(Jooq)的问题。
例如,表结构

CREATE TABLE mytable (
    id int,
    data jsonb
);

INSERT INTO mytable VALUES
(1, '{"roles": ["ONE", "TWO", "FIVE"]}'),
(2, '{"roles": ["ONE", "SIX"]}');

字符串
在我的原始SQL查询中,我是按数组值搜索的。这份工作

SELECT
    id,
    data
FROM
    mytable
WHERE
    jsonb_exists_all(mytable.data -> 'roles', array['ONE','TWO'])


在下一步中,我将尝试编写Java代码,并且在实现安全请求的绑定(参数)方面遇到了一些问题。

String args = "'ONE','TWO'";

Flux.from(dsl.selectFrom(MyTable.MYTABLE)
          .where(noCondition().and("jsonb_exists_all(parameters -> 'roles', array[" + args + "])")))
          .map(record -> record.into(MyTableDto.class))
          .collectList();


有没有可能在没有连接的情况下进行绑定?
我会很感激的!

c9x0cxw0

c9x0cxw01#

首先,with jOOQ, you should never concatenate strings。总有更好的办法。
在你的例子中,你可以使用plain SQL templates如下:

.where("json_exists_all({0}, {1})",
    jsonGetAttribute(MYTABLE.DATA, inline("roles")),
    val(new String[] { "ONE", "TWO" })
)

字符串
这是使用:

相关问题