如何优化JPA查询

时间:2012-07-12 07:42:47

标签: java jpa persistence jpa-2.0

我有三个实体如下:

public class EntityA
{
    private Long id;
    //Getters and setters
}

public class EntityB
{
    private Long id;
    private EntityA entitya;
    //Getters and setters
}

public class EntityC
{
    private Long id;
    private BigDecimal amount;
    private EntityB entityb;
    //Getters and setters
}

现在,给定EntityA实例,我想获得一个EntityC列表。我目前有两种选择。我不知道哪一个更优化。选项包括:

1.
select c from EntityC c where c.entityb in (select b from EntityB b where b.entitya = :entitya)

2。 向EntityB添加新属性

private Set<EntityC> entityCCol;

@OneToMany(mappedBy="entityb")
public Set<EntityC> getEntityCCol()
{
   return entityCCol;
}

select b from EntityB a join fetch a.entityCCol b

这两个查询中的哪一个更容易和优化?

2 个答案:

答案 0 :(得分:3)

这取决于集合的大小。对于小型集合,我将使用对象模型中的关系。从设计/可用性的角度来看,比性能更多,它更面向对象。我不会加入获取它,只是正常访问模型。您可能还应该有从A到B的关系,以使您的模型更有用。

对于#1中的查询,使用子选择查询效率不高,只需使用连接,

从EntityC c中选择c,其中c.entityb.entitya =:entitya

答案 1 :(得分:2)

我认为所有查询都解释为SQL查询,这些只是不同的样式,你不必考虑它。所有查询都将解释为theta样式。我不认为,有性能差异,它只是个人选择。这是一篇关于SQL查询样式MySQL joins: ON vs. USING vs. Theta-style的新文章,我希望这个链接能以某种方式帮助你。