代码之家  ›  专栏  ›  技术社区  ›  Igor Mukhin

在JPA中选择具有子实体的多个实体的最佳优化方法是什么?

  •  3
  • Igor Mukhin  · 技术社区  · 15 年前

    假设我们有:

    @Entity public class Order {
      @Id private int id;
      @OneToMany(mappedBy="order") private List<Item> items;
      ...
    }
    

    @Entity public class Item {
      @Id private int id;
      @ManyToOne private Order order;
      ...
    }
    

    假设有10000个订单,每个订单有20个项目。

    我们需要迭代所有顺序和它们的所有项。 在JPA中最好的方法是什么?

    我的问题是,如果我只是迭代如下元素:

    for (Order order: em.createTypeQuery("select o from Order o", Order.class).getResultList()) {
        report.printOrder(order);
        for (Item item: order.getItems()) {
            report.printOrderItem(item);
        }
    }
    

    它将导致10.001 sql查询: 10.000次:从订单id=?

    (我们正在使用EclipseLink)

    2 回复  |  直到 15 年前
        1
  •  2
  •   Gordon Yorke    15 年前

    您可能还需要考虑EclipseLink查询提示”日蚀批值为“o.items”。这将导致两个查询,但比一个大型联合查询效率更高。

        2
  •  0
  •   axtavt    15 年前

    join fetch (这也需要 distinct 自从 加入获取 有一个 join 语义):

    select distinct o from Order o join fetch o.items