如何将本机 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 函数(不可索引)代替 ?,参见