如何将本机 SQL 函数公开为谓词
Howto expose a native SQL function as a predicate
我的数据库中有一个 table,它将字符串值列表存储为 jsonb 字段。
create table rabbits_json (
rabbit_id bigserial primary key,
name text,
info jsonb not null
);
insert into rabbits_json (name, info) values
('Henry','["lettuce","carrots"]'),
('Herald','["carrots","zucchini"]'),
('Helen','["lettuce","cheese"]');
我想过滤我的行,检查信息是否包含给定值。
在 SQL 中,我会使用 ? operator:
select * from rabbits_json where info ? 'carrots';
如果我今天的谷歌搜索技术还不错,我相信这还没有在 JOOQ 中实现:
https://github.com/jOOQ/jOOQ/issues/9997
如何在查询中使用本机谓词在 JOOQ 中编写等效查询?
对于 jOOQ 本身不支持的任何内容,您应该使用 plain SQL templating,例如
Condition condition = DSL.condition("{0} ? {1}", RABBITS_JSON.INFO, DSL.val("carrots"));
不幸的是,在这种特定情况下,您将 运行 into this issue here。使用 JDBC PreparedStatement
,您仍然不能将 ?
用于绑定变量以外的其他用途。作为解决方法,您可以:
- 使用
Settings.statementType == STATIC_STATEMENT
以防止在这种情况下使用 PreparedStatement
- 使用
jsonb_exists_any
函数(不可索引)代替 ?
,参见
我的数据库中有一个 table,它将字符串值列表存储为 jsonb 字段。
create table rabbits_json (
rabbit_id bigserial primary key,
name text,
info jsonb not null
);
insert into rabbits_json (name, info) values
('Henry','["lettuce","carrots"]'),
('Herald','["carrots","zucchini"]'),
('Helen','["lettuce","cheese"]');
我想过滤我的行,检查信息是否包含给定值。 在 SQL 中,我会使用 ? operator:
select * from rabbits_json where info ? 'carrots';
如果我今天的谷歌搜索技术还不错,我相信这还没有在 JOOQ 中实现: https://github.com/jOOQ/jOOQ/issues/9997
如何在查询中使用本机谓词在 JOOQ 中编写等效查询?
对于 jOOQ 本身不支持的任何内容,您应该使用 plain SQL templating,例如
Condition condition = DSL.condition("{0} ? {1}", RABBITS_JSON.INFO, DSL.val("carrots"));
不幸的是,在这种特定情况下,您将 运行 into this issue here。使用 JDBC PreparedStatement
,您仍然不能将 ?
用于绑定变量以外的其他用途。作为解决方法,您可以:
- 使用
Settings.statementType == STATIC_STATEMENT
以防止在这种情况下使用PreparedStatement
- 使用
jsonb_exists_any
函数(不可索引)代替?
,参见