3

ParameterizedRowMapperで親リストを設定しようとしていますが、これはどのように記述またはアプローチされますか。親用と子用の2つのオブジェクトがありますが、子にはリストが含まれています。各子の親はデータベースの個別のテーブルに格納され、マッピングは1つです。

親のレコードの選択は、別のResultSetで行われます。マッピングは個別に行う必要がありますか(個別のParameterizedRowMapper)、その場合、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
}
4

1 に答える 1

2

正規の1対多の例でこれを行う方法を示します。これをvoクラス/テーブルに適合させることができます。

注文クラス

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

アイテムクラス

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

クラスごとに1つずつ2つの行マッパーを使用し、結果セットエクストラクターを使用して複数の行を1つの順序+ラインアイテムに変換します

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;
                }

            });
}
于 2013-03-24T11:47:07.690 に答える