ParameterizedRowMapper, который отображает список объектов в объект
Я пытаюсь установить список родителей в ParameterizedRowMapper, как это написано или приближается. У меня есть два объекта, один для родителя и один для детей, однако дети содержат список. Родители для каждого ребенка хранятся в отдельной таблице в базе данных, и отображение 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
}
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
}
Используйте два сопоставителя строк, по одному для каждого класса, а затем используйте экстрактор набора результатов, чтобы преобразовать несколько строк в один порядок + позиции
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;
}
});
}