如何将MySQL中WITH `cte` AS (VALUES ROW(n))语法转换为jOOQ DSL
jOOQ实现MySQL VALUES ROW构造CTE的可行方案
以下两种方案均可以生成你需要的目标SQL,不会产生多余UNION操作,执行计划与手写SQL完全一致:
方案1:jOOQ 3.15+ 原生实现(推荐)
jOOQ 3.15及以上版本原生支持VALUES构造器作为CTE数据源,直接调用官方API即可:
import static org.jooq.impl.DSL.*; // 构造VALUES ROW集合,支持动态传入任意数量行,多字段直接按顺序传入row方法即可,比如row(1, "test", 100) var valuesPart = values( row(1), row(2), row(n) // 可根据业务需要循环生成Row对象传入 ); // 定义CTE,指定别名和字段名 var cte = name("cte").as(valuesPart).fields("your_column_name"); // 后续查询逻辑示例 var result = dslContext.with(cte) .selectFrom(cte) // 这里添加你的业务查询逻辑 .fetch();
生成的SQL完全匹配需求:
WITH `cte` AS (VALUES ROW(1), ROW(2), ROW(n)) SELECT * FROM `cte`
方案2:jOOQ 3.15以下版本兼容实现
如果无法升级jOOQ版本,可以使用纯SQL模板的方式实现,注意参数用占位符避免SQL注入风险:
import static org.jooq.impl.DSL.*; import java.util.stream.Collectors; // 你的参数集合示例 List<Integer> params = List.of(1,2,n); // 构造VALUES部分的SQL模板 String valuesSql = "VALUES " + params.stream().map(p -> "ROW(?)").collect(Collectors.joining(",")); // 绑定参数构造CTE var cte = name("cte").as(table(valuesSql, params.toArray())).fields("your_column_name"); // 后续查询逻辑和方案1完全一致 var result = dslContext.with(cte) .selectFrom(cte) // 业务查询逻辑 .fetch();
内容的提问来源于stack exchange,提问作者mbto
相关产品推荐
相关产品推荐

