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

如何在PostgreSQL+JDBC中用DataClassRowMapper映射数组到Java List

问题描述

我用PostgreSQL搭建了数据库,现在需要查询包含数组类型字段的对象。想知道能不能通过DataClassRowMapper把PostgreSQL数组直接映射成Java的List<UUID>?还是必须要自定义映射器?这个Java Record会作为REST接口的响应返回给客户端。

SQL 查询示例

select t1.uuid, t1.name, array_agg(t2.a_uuid) a_uuids
from table1 t1
join table2 t2 on t1.uuid = t2.b_uuid
group by t1.uuid, t1.name

Java 代码示例

jdbcTemplate.queryForObject("""query""", params, DataClassRowMapper.newInstance(Result.class));

Result Record 定义

public record Result(UUID uuid, String name, List<UUID> aUuids) {}

解答

可以直接用DataClassRowMapper实现PostgreSQL数组到Java List<UUID>的映射,不需要自定义映射器,但要满足两个前提:

  • 项目中已引入PostgreSQL JDBC驱动(建议用42.2.0及以上版本,对数组类型的支持更完善);
  • 驱动会自动把PostgreSQL的uuid[]类型映射为Java的UUID[]数组,而DataClassRowMapper支持将数组类型自动转换为对应泛型的List集合。

同时注意几个细节:

  • 确保Record字段名和查询列名匹配:SQL里的a_uuids和Record里的aUuids,DataClassRowMapper默认支持驼峰与下划线的自动转换,这个对应关系是成立的;
  • 如果映射失败,先检查JDBC驱动版本是否过低,旧版本对UUID数组的支持可能存在问题;
  • 作为REST响应返回时,Spring的消息转换器(比如Jackson)会自动把List<UUID>序列化为JSON数组,客户端可直接解析,无需额外配置。

要是遇到特殊场景导致默认映射异常,也可以手动写映射逻辑兜底:

jdbcTemplate.queryForObject(sql, params, (rs, rowNum) -> 
    new Result(
        rs.getObject("uuid", UUID.class),
        rs.getString("name"),
        Arrays.asList(rs.getObject("a_uuids", UUID[].class))
    )
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:25:48