如何在JOOQ的IN子句中使用Postgres的VALUES函数优化大参数查询
解决方案
完全可以实现,jOOQ原生支持构造PostgreSQL风格的VALUES列表IN查询,无需修改现有数据模型,具体实现方式如下:
首先引入jOOQ DSL的静态导入:
import static org.jooq.impl.DSL.*;
假设你要传入的page值列表为List<Integer> pageIdList,查询条件的构造写法如下:
// 假设ENTITY是jOOQ生成的对应表实例,PAGE是表中的page字段 dslContext.selectFrom(ENTITY) .where(ENTITY.PAGE.in( values( pageIdList.stream() .map(DSL::row) .toArray(RowN[]::new) ) )) .fetch();
以上代码生成的原生SQL就和你预期的写法完全一致:
WHERE "entity"."page" IN (VALUES (1), (2), (3), (4), (5), ...)
注意事项
- 如果遇到PostgreSQL类型推断报错的情况,可以给每行值显式指定类型,修改stream映射逻辑即可:
.map(id -> row(id).cast(ENTITY.PAGE.getDataType())) - 所有参数都会以预编译绑定参数的形式传入,不会硬编码到SQL中,不存在SQL注入风险,性能和你手写原生SQL完全一致。
内容的提问来源于stack exchange,提问作者jch-me
相关产品推荐
相关产品推荐

