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

如何用jOOQ在PostgreSQL中实现枚举类型的unnest(enum_range)操作?

在jOOQ中实现PostgreSQL枚举类型的展开

要实现你需要的SELECT unnest(enum_range(NULL::week_days)) AS day表达式,分两种场景处理:

1. 使用jOOQ代码生成器生成的枚举类(推荐)

假设你已经通过jOOQ代码生成器生成了对应week_days枚举的Java类WeekDays,可以直接用jOOQ内置函数构建表达式:

核心表达式代码

// 构建展开枚举的查询
Select<Record1<WeekDays>> enumSelect = DSL.select(
    DSL.unnest(DSL.enumRange(DSL.val(null, WeekDays.class))).as("day")
);

整合到WITH子句的完整示例

// 定义CTE
CommonTableExpression<Record1<WeekDays>> weekdays = DSL.name("weekdays")
    .as(enumSelect);

// 主查询(结合你的CROSS JOIN场景)
Result<?> result = ctx.select(USERS.ID, USERS.NAME, field("day", WeekDays.class))
    .from(USERS)
    .crossJoin(weekdays)
    .fetch();

关键说明:

  • DSL.enumRange()对应PostgreSQL的enum_range函数,通过DSL.val(null, WeekDays.class)模拟NULL::week_days的类型转换。
  • DSL.unnest()用来展开enum_range返回的枚举数组。
  • 查询结果中的day字段会自动映射为WeekDays枚举类型,无需手动转换。

2. 原生SQL方式(不依赖生成的枚举类)

如果暂时未使用代码生成器,也可以直接编写原生SQL片段:

// 构建展开枚举的查询
Select<?> enumSelect = DSL.select(
    DSL.field("unnest(enum_range(NULL::week_days))", String.class).as("day")
);

// 整合到CTE
CommonTableExpression<?> weekdays = DSL.name("weekdays")
    .as(enumSelect);

这种方式返回的day字段为字符串类型,需要自行转换为对应枚举。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:19:55