You need to enable JavaScript to run this app. 如何将MySQL中WITH `cte` AS (VALUES ROW(n))语法转换为jOOQ DSL
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:09:03