spring jdbc模板将多行映射到父子实体

时间:2016-05-09 17:13:13

标签: spring-jdbc

我们使用的是spring jdbc模板(4.1.x),我们的父级是Customer,我们之间存在嵌套关系。客户可以有0个或更多订单。每个订单可以有1个或多个lineitems。每个订单项都可以包含一个详细信息和状态。

我们正在寻找的是map sql查询结果(一个带多个连接的查询)来映射这些实体。

有谁知道如何在行级别上完成它?

1 个答案:

答案 0 :(得分:0)

您可以使用ResultSetExtractor。然后,您可以通过迭代来以常规方式处理ResultSet。但是,您可以重用RowMapper类以避免重复该代码。

示例:

public class OrderExtractor implements ResultSetExtractor {

public List<Customer> extractData(ResultSet rs) throws SQLException, DataAccessException {

    Map<Number, Customer> customers = new HashMap<>();

    CustomerMapper customerMapper = new CustomerMapper();
    OrderMapper orderMapper = new OrderMapper();
    LineItemMapper lineItemMapper = new LineItemMapper();

    while (rs.next()) {

        Customer customer = customerMapper.mapRow(rs, -1);
        if (!customers.containsKey(customer.getCustomerId())) {
            customers.put(customer.getCustomerId(), customer);
        } else {
            customer = customers.get(customer.getCustomerId());
        }

        Order order = orderMapper.mapRow(rs, -1);
        if (!customer.hasOrder(order.getNumber())) {
            customer.addOrder(order);
        } else {
            order = customer.getOrder(order.getNumber());
        }

        LineItem lineItem = lineItemMapper.mapRow(rs, -1);
        if (!order.hasLineItem(lineItem.getNumber())) {
            order.addLineItem(lineItem);
        }

        // Add other child entities here
    }

    return new ArrayList<>(customers.values());
}

}