Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中选择具有子实体的多个实体的最佳优化方法是什么?_Java_Optimization_Jpa_Eclipselink_One To Many - Fatal编程技术网

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

Java 在JPA中选择具有子实体的多个实体的最佳优化方法是什么?,java,optimization,jpa,eclipselink,one-to-many,Java,Optimization,Jpa,Eclipselink,One To Many,假设我们有: @Entity public class Order { @Id private int id; @OneToMany(mappedBy="order") private List<Item> items; ... } 假设有10000个订单,每个订单有20个项目 我们需要迭代所有顺序及其所有项。 在JPA中最好的方法是什么 我的问题是,如果我只是迭代如下元素: for (Order order: em.createTypeQuery("select o

假设我们有:

@Entity public class Order {
  @Id private int id;
  @OneToMany(mappedBy="order") private List<Item> items;
  ...
}
假设有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查询: 1次:从订单中选择* 10.000次:从订单id=

有没有办法优化它?两个问题?一个问题

(我们正在使用EclipseLink)


谢谢。

您可以使用
join-fetch
(这也需要
distinct
,因为
join-fetch
具有
join
语义):


您可能还想考虑值为“O.ItAsvices”的Eclipse查询提示“Eclipse”批次。这将导致两个查询,但可能比一次大型联合查询更有效。

谢谢。我刚刚测试了它,发现:1)您可以使用这种类型的多个提示,比如:q.setHint(“eclipseelink.batch”、“t.testSurveys”);q、 setHint(“eclipselink.batch”、“t.testDefects”);2) EclipseLink以一种懒惰的方式使用此批处理提示。它发送秒查询以获取o.items,不是立即,而是在调用first order.getItems()之后。谢谢。这也很有帮助。但是,在我测试之后:join fetch将此查询转换为“从Order o,Item i中选择不同的o.*,i.*,其中o.id=i.orderId”,这意味着对于每个项目,结果集都将传输订单的所有字段。在某些情况下,这会导致很大的开销。
for (Order order: em.createTypeQuery("select o from Order o", Order.class).getResultList()) {
    report.printOrder(order);
    for (Item item: order.getItems()) {
        report.printOrderItem(item);
    }
}
select distinct o from Order o join fetch o.items