Java 如何优化JPA查询

Java 如何优化JPA查询,java,jpa,persistence,jpa-2.0,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 BigDecima

我有以下三个实体:

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)
二,。 将新属性添加到EntityB

private Set<EntityC> entityCCol;

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

select b from EntityB a join fetch a.entityCCol b
private Set entitycol;
@OneToMany(mappedBy=“entityb”)
公共集getEntityCol()
{
返回EntityCol;
}
从EntityB a中选择b连接获取a.EntityCol b

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

我认为所有的查询都被解释为SQL查询,这些只是不同的样式,您不必考虑它。所有查询都将解释为θ样式。我不认为,有性能上的差异,这只是个人的选择。这是一篇关于SQL查询风格的非常新鲜的文章,我希望这个链接能对您有所帮助。

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

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


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

如何
从EntityC中选择c,其中c.entityb.entitya=:a
?如果创建此查询,并
在entityB(entityA,id)上创建索引IX_B_A)
生成的查询将足够快。我对上述两个查询以及任何其他建议的查询关心的是性能。猜猜看,在数据库中EntityB有大约20000条记录,20000条记录中的每一条都至少有200条记录,即EntityC。