如何使用 JOOQ 在 postgres 值表达式中应用强制转换
How to apply cast in postgres values expression with JOOQ
对于 Postgres 中的大型 'in' 条件,以下
IN (VALUES ('a'),('b'),('c'))
可以产生比
更高效的查询计划
IN ('a','b','c')
在JOOQ中我可以用
来表达
Field f = ...
Row1[] rows = new Row1[array.length];
for (int i=0;i<array.length;i++)
rows[i] = DSL.row(array[i]);
Condition c = f.in(DSL.selectFrom(DSL.values(rows)));
但是如果我需要转换值怎么办?更具体地说,当将值与 citext 列进行比较时,至少需要将其中一个值显式转换为 citext 才能使查询正常工作。示例:
select distinct "x0"."pk"
from "sometable" as "x0"
where "x0"."external_shared_id" in ( values
('ext0308174863'::citext),
('ext1560238348'))
我怎样才能用 JOOQ 写这个?
目前没有记录的方法来创建自定义数据类型以供在转换中使用。您可以自行承担使用内部 API 的风险,我不会在此处记录。我创建了一个功能请求来创建这样的 DataType
引用:
https://github.com/jOOQ/jOOQ/issues/11806
citext
支持的明确功能请求在此处:
https://github.com/jOOQ/jOOQ/issues/5934
一如既往,when jOOQ is missing support for vendor specific functionality plain SQL templating is your friend。所以,就这样做:
rows[i] = row(field("{0}::citext", String.class, val(array[i])));
假设以下静态导入:
import static org.jooq.impl.DSL.*;
对于 Postgres 中的大型 'in' 条件,以下
IN (VALUES ('a'),('b'),('c'))
可以产生比
更高效的查询计划IN ('a','b','c')
在JOOQ中我可以用
来表达Field f = ...
Row1[] rows = new Row1[array.length];
for (int i=0;i<array.length;i++)
rows[i] = DSL.row(array[i]);
Condition c = f.in(DSL.selectFrom(DSL.values(rows)));
但是如果我需要转换值怎么办?更具体地说,当将值与 citext 列进行比较时,至少需要将其中一个值显式转换为 citext 才能使查询正常工作。示例:
select distinct "x0"."pk"
from "sometable" as "x0"
where "x0"."external_shared_id" in ( values
('ext0308174863'::citext),
('ext1560238348'))
我怎样才能用 JOOQ 写这个?
目前没有记录的方法来创建自定义数据类型以供在转换中使用。您可以自行承担使用内部 API 的风险,我不会在此处记录。我创建了一个功能请求来创建这样的 DataType
引用:
https://github.com/jOOQ/jOOQ/issues/11806
citext
支持的明确功能请求在此处:
https://github.com/jOOQ/jOOQ/issues/5934
一如既往,when jOOQ is missing support for vendor specific functionality plain SQL templating is your friend。所以,就这样做:
rows[i] = row(field("{0}::citext", String.class, val(array[i])));
假设以下静态导入:
import static org.jooq.impl.DSL.*;