求下述SQL语句对应的等价JOOQ查询实现
对应的jOOQ等价写法
假设你已通过jOOQ代码生成器生成对应的数据表类 E_REQUEST_PARTICIPATION,可以用以下两种方式实现等价逻辑:
方式一:使用生成的表类+DSL子查询
import static org.jooq.impl.DSL.*; // 构建request_id数组的子查询 var r = select(unnest(array( "clh9omw2o00000134toygpm7o", "clh5gs4rb0000wy34v69u2usm" )).as("request_id")); // 构建participant_id数组的子查询 var p = select(unnest(array( "cldzqdwou0000pu3604veic10", "cl98n9e7100003x36zaeh7hma" )).as("participant_id")); // 主查询逻辑 var result = ctx.select( E_REQUEST_PARTICIPATION.E_REQUEST_ID, E_REQUEST_PARTICIPATION.E_PARTICIPANT_ID ) .from(E_REQUEST_PARTICIPATION.as("e")) .join(r.as("r")) .on(E_REQUEST_PARTICIPATION.E_REQUEST_ID.eq(field(name("r", "request_id"), String.class))) .join(p.as("p")) .on(E_REQUEST_PARTICIPATION.E_PARTICIPANT_ID.eq(field(name("p", "participant_id"), String.class))) .fetch();
方式二:纯DSL写法(未使用生成的表类)
如果没有生成表类,可直接通过DSL指定表和字段名:
import static org.jooq.impl.DSL.*; var r = select(unnest(array( "clh9omw2o00000134toygpm7o", "clh5gs4rb0000wy34v69u2usm" )).as("request_id")); var p = select(unnest(array( "cldzqdwou0000pu3604veic10", "cl98n9e7100003x36zaeh7hma" )).as("participant_id")); var result = ctx.select( field(name("e", "e_request_id"), String.class), field(name("e", "e_participant_id"), String.class) ) .from(table(name("e_request_participation")).as("e")) .join(r.as("r")) .on(field(name("e", "e_request_id")).eq(field(name("r", "request_id")))) .join(p.as("p")) .on(field(name("e", "e_participant_id")).eq(field(name("p", "participant_id")))) .fetch();
关键对应说明
- 原SQL中的
unnest(array[...])对应jOOQ的unnest(array(...))方法 - 子查询、表的别名通过
as()方法设置 - 生成表类场景可直接调用静态字段引用表列,纯DSL场景通过
name()方法指定表和字段的命名空间
内容的提问来源于stack exchange,提问作者Oreoluwa
相关产品推荐
相关产品推荐

