如何在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
相关产品推荐
相关产品推荐

