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

jOOQ映射PostgreSQL对象类型时如何仅提取字段value值

jOOQ自定义类型字段提取value值的解决方案

你遇到的是jOOQ对数据库自定义类型(UDT)的默认序列化行为,node_category属于UDT字段,默认会返回包含type、value、null标识的完整结构对象,可以通过以下几种方式仅提取value值:

方案1:查询阶段直接提取(推荐)

在编写jOOQ查询语句时,直接指定读取UDT的value属性并设置别名,无需后续二次处理:

// 示例查询写法,将NODE_CATEGORY的value字段直接作为node_category返回
Result<Record> result = dslContext.select(
        NODE.NODE_ID,
        NODE.NODE_IP,
        NODE.IP_VERSION,
        NODE.PORT,
        NODE.NODE_NAME,
        NODE.NODE_CATEGORY.value.as("node_category")
    )
    .from(NODE)
    .where(/* 你的查询条件 */)
    .fetch();

// 此时转Map列表已经是预期结构
List<Map<String, Object>> resultMaps = result.intoMaps();

方案2:已有结果二次转换

如果不想修改原有查询逻辑,可以对已经生成的Map列表做遍历替换:

List<Map<String, Object>> originMaps = jooq.fetch(q).intoMaps();
List<Map<String, Object>> processedMaps = originMaps.stream()
    .map(map -> {
        Object categoryObj = map.get("node_category");
        // 若为原生UDT记录对象
        if (categoryObj instanceof UDTRecord) {
            map.put("node_category", ((UDTRecord<?>) categoryObj).get("value"));
        }
        // 若已经被序列化为嵌套Map
        else if (categoryObj instanceof Map) {
            map.put("node_category", ((Map<?, ?>) categoryObj).get("value"));
        }
        return map;
    })
    .toList();

方案3:全局配置自动转换

如果需要所有查询场景下该UDT都默认返回value值,可以自定义类型转换器绑定到对应UDT:

  1. 实现自定义Converter
import org.jooq.Converter;

public class NodeCategoryConverter implements Converter<NodeCategoryRecord, String> {
    @Override
    public String from(NodeCategoryRecord udt) {
        return udt == null ? null : udt.getValue();
    }

    @Override
    public NodeCategoryRecord to(String value) {
        return value == null ? null : new NodeCategoryRecord(value);
    }

    @Override
    public Class<NodeCategoryRecord> fromType() {
        return NodeCategoryRecord.class;
    }

    @Override
    public Class<String> toType() {
        return String.class;
    }
}
  1. 在jOOQ代码生成配置中,将该Converter绑定到cm.node_category类型,后续生成的代码会自动完成转换,所有查询返回的node_category字段直接为value值。

内容的提问来源于stack exchange,提问作者Cemre Mengü

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:15:07