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

