2012-07-12 250 views
5

我有三个实体如下:如何优化JPA查询

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 

这两个查询更容易和优化?

+1

什么关于'从EntityC c中选择c,其中c.entityB.entityA =:a'?如果你创建了这个查询,并且在entityB(entityA,id)上创建索引IX_B_A,那么结果查询就足够快了。 – 2012-07-12 10:42:59

回答

3

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

对于#1查询,查询也不是很有效的使用子查询,只需使用一个连接,

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

2

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

+0

我对上述两个查询和任何其他建议查询的关注是性能。猜测数据库EntityB中有大约20,000条记录,20,000条记录中的每条记录至少有200条记录,即EntityC。 – 2012-07-12 10:44:51