检索和迭代一对多的最佳实践

时间:2012-10-18 18:01:50

标签: jstl javabeans

我正在尝试根据每个订单的订单项详细信息生成每个订单订单的网页报告。 所以它看起来像这样:

Customer 1  | Order 1  |     Item 1    |
            |          | == New Row == |
            |          |     Item 2    |                     
            |          | == New Row == |
            |          |     Item 3    |                     
            |          | == New Row == |
            | ====== New Row ========= |
            | Order 2  |     Item 1    |                     
            |          | == New Row == |
            |          |     Item 2    |                     
            |          | == New Row == |
            |          |     Item 3    |                     
            |          | == New Row == |
            | ====== New Row ========= |
            | Order 3  |     Item 1    |                     
            |          |     Item 2    |
== New Row ==============================                     
Customer 2  | Order 1  |     Item 1    |                     
            |          | == New Row == |
            |          |     Item 2    |                     
            |          | == New Row == |
            |          |     Item 3    |                     
            |          | == New Row == |
            |          |     Item 4    |                     
            |          | == New Row == |
            |          |     Item 5    |                     
            |          | == New Row == |
            | ====== New Row ========= |
            | Order 2  |     Item 1    |                     
            |          | == New Row == |
            |          |     Item 2    |                     
            |          | == New Row == |
            |          |     Item 3    |                     
== New Row ==============================                     

获取数据的数组列表是否更好:

1  | 1 |  1 |                     
1  | 1 |  2 |                     
1  | 1 |  3 |                     
1  | 2 |  1 |                     
1  | 2 |  2 |                     
1  | 2 |  3 |                     
1  | 3 |  1 |                     
1  | 3 |  2 |                     
2  | 1 |  1 |                     
2  | 1 |  2 |                     
2  | 1 |  3 |                     
2  | 1 |  4 |                     
2  | 1 |  5 |                     
2  | 2 |  1 |                     
2  | 2 |  2 |                     
2  | 2 |  3 |                     

并传递1个JavaBean并使用JSTL确定嵌套,如下所示:

  this is incomplete for brevity
  <table><tr><th>Customer No</th><th>Orders</th></tr>
  <c:forEach var="custOrderLineItem" items="${customerOrderLineItemList}">
  <c:set var="currentOrder" value="custOrderLineItem.orderId">
  <c:set var="currentCustomer" value="custOrderLineItem.customerId">

  <c:if test="${currentOrder != custOrderLineItem.orderId}">
      ==New Row==
  </c:if>

或者使用嵌套的JavaBeans

是否更好?
Customer.setOrders<List>
Orders.setOrderDetails<List>
OrderDetails.setLineItem<List>

然后使用JSTL

      <c:forEach var="customer" items="${customerList}">
         <c:forEach var="order" items="${customer.orderList}">
             <c:forEach var="lineItem" items="${order.detailList}">

在花时间写这篇文章后,我觉得第二种方法看起来更干净,更容易。但第一种方法似乎有一个更简单的SQL查询。我没有使用JPA,只是基本的JDBC sql调用。那么如何在没有JPA的情况下填充嵌套的JavaBeans?你做这样的事吗?

  List<Customer> custList = getCustomerList();
  ListIterator custListIter = custList.listIterator();
     while (custListIter.hasNext()) {
         customer = (Customer) custListIter.next();
         List<Order> orderList = getOrderList(customer.getId());
         ListIterator orderListIter = orderList.listIterator();
        while (orderListIter.hasNext()) {
                 order = (Order) orderListIter.next();
                 List orderDetailsList<OrderDetail> = getOrderDetailList(order.getId);
                 order.setOrderDetails(orderDetailsList);
                 orderListIter.set(order);
             }
         customer.setOrderList(orderList);
         custListIter.set(customer);
      }

1 个答案:

答案 0 :(得分:1)

您可以简单地创建返回所有内容的SQL查询,并从结果集中构建对象图。使用映射来保持ID与相应对象之间的关联:

Map<Long, Customer> customersById = new HashMap<Long, Customer>();
Map<Long, Order> ordersById = new HashMap<Long, Order>();
Map<Long, Item> itemsById = new HashMap<Long, Item>();
while (rs.next()) {
    Long customerId = rs.getLong(1);
    Customer customer = customersById.get(customerId);
    if (customer == null) {
        customer = new Customer(customerId);
        // populate other fields of customer
        customersById.put(customerId, customer);
    }

    Long orderId = rs.getLong(5);
    Order order = ordersById.get(orderId);
    if (order == null) {
        order = new Order(orderId);
        customer.addOrder(order);
        // populate other fields of order
        ordersById.put(orderId, order);
    }

    // same for items

}

在循环结束时,您拥有所有客户,每个客户都有订单,每个客户都有自己的商品。