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

如何在Spring Boot中用JdbcTemplate转换为自定义JSON/对象

解决JdbcTemplate结果转客户-商品列表JSON的方案

1. 定义对应实体类

先把数据映射到实体结构里,方便后续组装:

// 商品实体
public class Product {
    private Long id;
    private String name;
    private BigDecimal price;
    // 省略构造器、getter、setter
}

// 客户实体,包含对应商品列表
public class Customer {
    private Long customerId;
    private String customerName;
    private String contact;
    private List<Product> products = new ArrayList<>();
    // 省略构造器、getter、setter
}

2. 用ResultSetExtractor实现分组逻辑

因为你的查询已经按客户排序,直接用ResultSetExtractor遍历结果集,手动把同一客户的商品归组,逻辑和你之前原生操作ResultSet完全一致:

public List<Customer> getCustomerWithProducts() {
    String sql = "SELECT c.customer_id, c.customer_name, c.contact, p.id, p.name, p.price " +
                 "FROM customer_product_table " +
                 "ORDER BY c.customer_id";

    return jdbcTemplate.query(sql, (ResultSet rs) -> {
        Map<Long, Customer> customerMap = new HashMap<>();
        while (rs.next()) {
            Long customerId = rs.getLong("customer_id");
            // 复用已存在的客户对象,不存在则新建
            Customer customer = customerMap.getOrDefault(customerId, new Customer());
            // 仅首次加载客户基础信息
            if (customer.getCustomerId() == null) {
                customer.setCustomerId(customerId);
                customer.setCustomerName(rs.getString("customer_name"));
                customer.setContact(rs.getString("contact"));
                customerMap.put(customerId, customer);
            }
            // 构建商品并添加到客户列表
            Product product = new Product();
            product.setId(rs.getLong("id"));
            product.setName(rs.getString("name"));
            product.setPrice(rs.getBigDecimal("price"));
            customer.getProducts().add(product);
        }
        return new ArrayList<>(customerMap.values());
    });
}

3. 转换为自定义JSON结构

拿到组装好的List<Customer>后,用Spring自带的Jackson ObjectMapper直接转成JSON即可:

@Autowired
private ObjectMapper objectMapper;

// 转换示例
public String convertToCustomerJson() throws JsonProcessingException {
    List<Customer> customerList = getCustomerWithProducts();
    return objectMapper.writeValueAsString(customerList);
}

额外提示

  • 必须保证SQL查询按客户ID排序,这样同一客户的商品会连续出现,分组逻辑才不会出错。
  • 不要用RowMapper处理这种分组场景,它只能逐行映射单个对象,没法直接实现客户-商品的关联组装。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:23:12