2012-07-12 85 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