Вопрос касается наилучшей практики использования RowMapper в сценариях master/detail, где мы хотим быстро получать детали с помощью spring jdbc.
Предположим, что у нас есть классы Invoice и InvoiceLine.
public class Invoice{
private BigDecimal invId;
private Date invDate;
private List<InvoiceLine> lines;
}
public class InvoiceLine{
private int order;
private BigDecimal price;
private BigDecimal quantity;
}
При использовании Spring Jdbc с устройством отображения строк у нас обычно есть
public class InvoiceMapper implements RowMapper<Invoice>{
public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException {
Invoice invoice = new Invoice();
invoice.setInvId(rs.getBigDecimal("INVID"));
invoice.setInvDate(rs.getDate("INVDATE"));
return invoice;
}
}
Теперь проблема в том, что я хочу быстро получить InvoiceLine, связанный с этим экземпляром счета. Было бы нормально, если бы я запрашивал базу данных в классе rowmapper? Или кто-то предпочитает другой путь? Я использую шаблон ниже, но не доволен этим.
public class InvoiceMapper implements RowMapper<Invoice>{
private JdbcTemplate jdbcTemplate;
private static final String SQLINVLINE=
"SELECT * FROM INVOICELINES WHERE INVID = ?";
public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException {
Invoice invoice = new Invoice();
invoice.setInvId(rs.getBigDecimal("INVID"));
invoice.setInvDate(rs.getDate("INVDATE"));
invoice.setLines(jdbcTemplate.query(SQLINVLINE,
new Object[]{invoice.getInvId},new InvLineMapper());
return invoice;
}
}
Я чувствую, что с этим подходом что-то не так, но лучшего способа найти не удалось. Я был бы более чем рад, если бы кто-нибудь мог показать мне, почему это плохой дизайн, и если да, то каким будет правильное использование.