2012-07-12 8 views
5

を最適化するためにどのように私は3つのエンティティを持っています。私は現在2つの選択肢があります。どちらが最適化されているか分かりません。オプションは次のとおりです。JPAクエリ

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

2. は

private Set<EntityC> entityCCol; 

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

select b from EntityB a join fetch a.entityCCol b 

これらの2つのクエリの簡単かつ最適化されているEntityB

に新しいプロパティを追加しますか?

+1

何約 'cをEntityCから選んでください。c.entityB.entityA =:a'?このクエリを作成し、 'entityB(entityA、id)にインデックスIX_B_Aを作成すると、結果のクエリは十分に速くなります。 –

答えて

3

コレクションのサイズによって異なります。小さなコレクションの場合は、オブジェクトモデルの関係を使用します。パフォーマンスよりも設計/ユーザビリティの観点から見ると、オブジェクト指向の方がますます重要です。私はそれをフェッチに参加しないだろう、ちょうどモデルを正常にアクセスします。モデルをより便利にするために、AからBまでの関係もあるはずです。 #1の問合せについては、お問合せは副問い合わせを使用して非常に効率的ではありません

、ちょうど参加を使用し、

c.entityb.entitya = EntityC cからCを選択:エンティティA

2

私はすべてのクエリをSQLクエリに解釈すると思っていますが、これらは異なるスタイルでしかないと思います。すべてのクエリがthetaスタイルに解釈されます。私は、パフォーマンスの違いがあるとは思わない、それは唯一の個人的な選択です。ここではSQLクエリスタイルMySQL joins: ON vs. USING vs. Theta-styleについての非常に新鮮な記事です、私はこのリンクが何とかあなたを助けてくれることを願っています。

+0

上記の2つのクエリと他の推奨されるクエリに関する懸念は、パフォーマンスです。データベースEntityBには約20,000レコードがあり、20,000レコードにはそれぞれ200レコード以上のEntityCがあります。 –