2016-12-07 3 views
0

私はエイリアスを使用しているので、他のテーブルを参照するフィールドを持つエンティティのリストを選択する基準を使用しています。問題は、私が結合フィールドにアクセスしようとすると、休止状態は別の選択をデータベースに実行するということです。これは実際には効果がありません。これは各結果行に対して1つのクエリを実行するためです。結合されたフィールドにアクセスするHibernateの基準

誰も私になぜこれが起こっているのか教えてもらえますか? (唯一の関連する行に減少)基準の

使い方

List<Country> list = session.createCriteria(Country.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .createAlias("locations", "location") 
    .list(); 

for (Countries cntry : list){ 
    cntry.getLocations().size(); // here hibernate execute another query 
} 

(重要な部分)

@Entity 
public class Country { 

    // other fields as uuid etc. 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "country") 
    private List<Location> locations; 

    // getters and setters 
} 

場所(重要な部分)

@Entity 
public class Location { 

    // other fields as uuid etc. 

     @ManyToOne(fetch = FetchType.LAZY) 
     @JoinColumn(name = "COUNTRY_UUID") 
     private Country country; 

    // getters and setters 
} 

答えて

1

試し:

List<Country> list = session.createCriteria(Country.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .setFetchMode("locations", FetchMode.JOIN) 
    .createAlias("locations", "location") 
    .list(); 

これは、すべての国と場所を取得し、単一のクエリを生じるはずです。

これに加えて、場所に@BatchSizeを設定する必要があります。 @BatchSize(size = 20)は、フェッチモードが設定されていない場合、20個のリレーションごとに1つのステートメントを発生させます。

+0

クエリは、すべての結合テーブルのすべてのフィールドを結合しましたが、これらのフィールドは設定されていないように見えます。フェッチモードの設定が役に立たなかった:( – cici

+1

あなたの問題はあなたのフェッチモードに間違いありません。どのバージョンのHibernateを使用していますか?古いバージョンのFetchMode.EAGERが必要です。 – teacurran

関連する問題