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:
- 实现自定义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; } }
- 在jOOQ代码生成配置中,将该Converter绑定到
cm.node_category类型,后续生成的代码会自动完成转换,所有查询返回的node_category字段直接为value值。
内容的提问来源于stack exchange,提问作者Cemre Mengü
相关产品推荐
相关产品推荐

