5

私は次のように3つのエンティティを持っています:

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のリストを取得したいと思います。現在、2つのオプションを利用できます。どちらがより最適化されているかわかりません。オプションは次のとおりです。

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つのクエリのどちらがより簡単で、最適化されていますか?

4

2 に答える 2

3

コレクションのサイズによって異なります。小さなコレクションの場合は、オブジェクト モデルのリレーションシップを使用します。パフォーマンスよりもデザイン/ユーザビリティの観点から見ると、よりオブジェクト指向です。ただし、フェッチには参加しません。通常どおりモデルにアクセスするだけです。モデルをより便利にするために、おそらく A から B への関係も持つ必要があります。

#1 のクエリでは、副選択を使用したクエリはあまり効率的ではありません。結合を使用するだけです。

c.entityb.entitya = :entitya の EntityC c から c を選択します。

于 2012-07-12T14:43:34.427 に答える
2

すべてのクエリは SQL クエリに解釈されると思いますが、これらはスタイルが異なるだけで、考える必要はありません。すべてのクエリは theta スタイルに解釈されます。性能差があるとは思いませんが、あくまで個人の好みです。これは、SQL クエリ スタイルの MySQL 結合に関する非常に新しい記事です: ON vs. USING vs. Theta-style、このリンクが何らかの形で役立つことを願っています。

于 2012-07-12T10:37:21.313 に答える