gpt4 book ai didi

Spring JDBC RowMapper 用于急切获取

转载 作者:IT老高 更新时间:2023-10-28 13:58:43 28 4
gpt4 key购买 nike

问题是关于 RowMapper 在我们希望使用 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;
}
}

我感觉这种方法有问题,但找不到更好的方法。如果有人能告诉我为什么这是一个糟糕的设计,我会非常高兴,如果是这样,那么正确的用法是什么。

最佳答案

ResultSetExtractor是执行此操作的更好选择。执行一个连接两个表的查询,然后遍历结果集。您将需要一些逻辑来聚合属于同一发票的多行 - 通过按发票 ID 排序并检查 ID 何时更改或使用如下示例所示的映射。

jdbcTemplate.query("SELECT * FROM INVOICE inv JOIN INVOICE_LINE line " +
+ " on inv.id = line.invoice_id", new ResultSetExtractor<List<Invoice>>() {

public List<Invoice> extractData(ResultSet rs) {
Map<Integer,Invoice> invoices = new HashMap<Integer,Invoice>();
while(rs.hasNext()) {
rs.next();
Integer invoiceId = rs.getInt("inv.id");
Invoice invoice = invoces.get(invoiceId);
if (invoice == null) {
invoice = invoiceRowMapper.mapRow(rs);
invoices.put(invoiceId,invoice);
}
InvoiceItem item = invLineMapper.mapRow(rs);
invoice.addItem(item);
}
return invoices.values();
}


});

关于Spring JDBC RowMapper 用于急切获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11455220/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com