如何使用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
相关产品推荐
相关产品推荐

