Каков наилучший оптимизированный способ выбора множества объектов с подразделами в JPA? - PullRequest
3 голосов
/ 17 августа 2010

Допустим, у нас есть:

@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;
  ...
}

И скажем, есть 10.000 заказов, каждый из которых имеет 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: 1 раз: выберите * из заказа 10.000 раз: выберите * из позиции, где order_id =?

Есть ли способ оптимизировать его? Два запроса? Один запрос?

(мы используем EclipseLink)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Вы также можете рассмотреть подсказку запроса EclipseLink "eclipselink.batch" со значением "o.items".Это приводит к двум запросам, но может быть более эффективным, чем один большой запрос.

0 голосов
/ 17 августа 2010

Вы можете использовать join fetch (для этого также требуется distinct, поскольку join fetch имеет семантику join):

select distinct o from Order o join fetch o.items
...