ParameterizedRowMapper, который сопоставляет список объектов с объектом

Я пытаюсь установить родительский список в ParameterizedRowMapper, как это написано или подходит. У меня есть два объекта: один для родителей и один для детей, однако дети содержат список родителей для каждого ребенка, которые хранятся в отдельной таблице в базе данных, и сопоставление равно 1-много.

Выбор записей для родителей будет выполняться в отдельном наборе результатов. Нужно ли будет выполнять сопоставление отдельно (отдельный 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, однако у меня есть вопросы по его использованию. Могу ли я интегрировать его в класс в момент установки родительского элемента? Может ли кто-нибудь подсказать мне, как это можно сделать правильно

Дети.java

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

//getters/setters

}

Родительский.java

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

//setters/getters
}

person devdar    schedule 21.03.2013    source источник


Ответы (1)


Я покажу, как это сделать на каноническом примере 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
}

Используйте два сопоставителя строк, по одному для каждого класса, а затем используйте экстрактор набора результатов, чтобы преобразовать несколько строк в один заказ + позиции.

ЗаказатьРепозиторий

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

            });
}
person gkamal    schedule 24.03.2013
comment
Я не проверял это. Он должен работать с некоторыми незначительными изменениями, особенно если в обеих таблицах есть столбцы с одинаковыми именами. - person gkamal; 24.03.2013
comment
Вы можете найти рабочую версию этого по адресу - github.com/gkamal/jdbc- шаблон "один ко многим" - person gkamal; 24.03.2013
comment
не будет компилироваться. RowMapper не является универсальным - person Nati; 23.05.2013
comment
Используйте версию Spring 3.0 или более позднюю или избавьтесь от дженериков и замените их приведением. - person gkamal; 23.05.2013