You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JOOQ实现WHERE子句中多列IN查询?

用jOOQ实现多列IN子句查询

基础静态多值写法

直接用jOOQ的row()方法构造多列行表达式,作为IN子句左侧,右侧传入多个row()构造的行值对即可:

// 假设已通过代码生成器生成表T及对应列COL1、COL2、WHATEVER
ResultQuery<Record> query = ctx.select(T.WHATEVER)
    .from(T)
    .where(row(T.COL1, T.COL2)
        .in(
            row(val1a, val2a),
            row(val1b, val2b)
        )
    );

动态值集合场景

如果多值对是动态生成的,可先将值封装为Record2类型列表,再传入in()方法:

// 构造动态行值集合
List<Record2<YourType1, YourType2>> valuePairs = Arrays.asList(
    row(val1a, val2a),
    row(val1b, val2b)
    // 可按需添加更多行值对
);

ResultQuery<Record> query = ctx.select(T.WHATEVER)
    .from(T)
    .where(row(T.COL1, T.COL2).in(valuePairs));

子查询作为IN数据源

若需用子查询结果作为多列匹配条件,同样用row()配合子查询实现:

ResultQuery<Record> query = ctx.select(T.WHATEVER)
    .from(T)
    .where(row(T.COL1, T.COL2)
        .in(
            select(OTHER_TABLE.COLX, OTHER_TABLE.COLY)
                .from(OTHER_TABLE)
                .where(OTHER_TABLE.SOME_CONDITION)
        )
    );

关键说明

  • row()是jOOQ构造行值表达式的核心API,用来将多列/多值组合成逻辑上的"行",完美适配SQL中的(col1, col2)语法。
  • jOOQ会自动适配不同数据库的语法支持:如果目标数据库原生不支持行值IN子句,jOOQ会自动将其转换为等价的(col1 = val1 AND col2 = val2) OR (...)形式。

内容的提问来源于stack exchange,提问作者Gili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:10:23