2013-03-21 101 views
1

我想在ParameterizedRowMapper中设置父列表如何写入或接近。我有两个对象,一个是父对象,一个是子对象,但是子对象包含一个List。每个子对象的父对象都存储在数据库的一个单独的表中,映射为1 - 多。ParameterizedRowMapper地图对象列表到对象

父母的记录选择将在单独的ResultSet中完成。将映射必须单独完成(单独ParameterizedRowMapper),如果是这样,我将不得不写如何编写ParameterizedRowMapper以容纳列表项目。

了ParameterizedRowMapper

public static class ChildrenMapper implements ParameterizedRowMapper<Children>{   

     public Children mapRow(ResultSet rs, int rowNum) throws SQLException { 
       Children child = new Children(); 
       child.setFirstName(rs.getString("firstName")); 
       child.setLastName(rs.getString("lastName")); 
        //a child can have many Parents or gaurdians 
       child.setParent(List<Parent>);     

       return child; 
      }  
    } 

根据我的研究,我发现,我需要使用ResultSetExtractor类,但是我已经在使用的一个问题。在设置父级时,我是否将它整合到课程中?可有人指导我如何可以做到正确的方式

Children.java

Public class Children(){ 
int cid; 
String firstName; 
String lastName; 
List<Parent>parents; 
.. 

//getters/setters 

} 

Parent.java

Public class Parent(){ 
int pid; 
String firstName; 
String lastName; 
.. 

//setters/getters 
} 

回答

1

我将展示如何为做到这一点规范的一对多的例子,你可以适应你的vo类/表。

Order类

public class Order { 
    private Long orderId; 
    private String user; 
    private List<LineItem> items; 
    // Getter/setter omitted 
} 

Item类

public class LineItem { 
    private Long lineItemId; 
    private String product; 
    private int quantity; 
    // Getter/setter omitted 
} 

使用两个rowmappers为每个类,然后使用一个结果集提取到多行转换成一个订单+行项目

OrderRepository

public final static RowMapper<Order> orderMapper = ParameterizedBeanPropertyRowMapper.newInstance(Order.class); 
public final static RowMapper<LineItem> lineItemMapper = ParameterizedBeanPropertyRowMapper.newInstance(LineItem.class); 

public Order findOrderWithItems(Long orderId) { 
    return jdbcTemplate.query("select * from orders, line_item " 
      + " where orders.order_id = line_item.order_id and orders.order_id = ?", 
      new ResultSetExtractor<Order>() { 
     public Order extractData(ResultSet rs) throws SQLException, DataAccessException { 
      Order order = null; 
      int row = 0; 
      while (rs.next()) { 
       if (order == null) { 
        order = orderMapper.mapRow(rs, row); 
       } 
       order.addItem(lineItemMapper.mapRow(rs, row)); 
       row++; 
      } 
      return order; 
     } 

    }, orderId); 
} 

public List<Order> findAllOrderWithItmes() { 
    return jdbcTemplate.query("select * from orders, line_item " 
      + " where orders.order_id = line_item.order_id order by orders.order_id", 
      new ResultSetExtractor<List<Order>>() { 
       public List<Order> extractData(ResultSet rs) throws SQLException, DataAccessException { 
        List<Order> orders = new ArrayList<Order>(); 
        Long orderId = null; 
        Order currentOrder = null; 
        int orderIdx = 0; 
        int itemIdx = 0; 
        while (rs.next()) { 
         // first row or when order changes 
         if (currentOrder == null || !orderId.equals(rs.getLong("order_id"))) { 
          orderId = rs.getLong("order_id"); 
          currentOrder = orderMapper.mapRow(rs, orderIdx++); 
          itemIdx = 0; 
          orders.add(currentOrder); 
         } 
         currentOrder.addItem(lineItemMapper.mapRow(rs, itemIdx++)); 
        } 
        return orders; 
       } 

      }); 
} 
+2

我还没有测试过它。它应该与一些小的调整 - 特别是如果在两个表中有相同名称的列.. – gkamal 2013-03-24 11:48:11

+1

你可以找到一个工作版本 - https://github.com/gkamal/jdbc-template-one-to-many – gkamal 2013-03-24 13:41:14

+0

不会编译。 RowMapper不是通用的 – Nati 2013-05-23 11:27:24