質問は、Spring jdbc を使用して詳細を熱心に取得したいマスター/詳細シナリオでの RowMapper のベスト プラクティスの使用法に関するものです。
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;
}
}
このアプローチには何か問題があると感じていますが、より良い方法は得られませんでした。誰かがなぜこれが悪いデザインなのか、もしそうなら正しい使い方を教えてくれたら嬉しいです.