1

これは、私が Hibernate とプロジェクションで達成しようとしていることの非常に単純化された例です。以下にいくつかのサンプル テーブルを示します。

class User{
    int id;
    String firstName;
    String lastName;
    List<Address> address ;
}

class Address{
    int id;
    String city;
    String state;   
    User user;
}

これは、データの定期的な選択を実行する方法です。

Criteria crit = getSession().createCriteria("User");
crit.add(CriterionUtils.in("id", new Object[]{1,2,3}));   
criteria.list();

これは機能し、完全な User オブジェクトと完全なアドレス リストを返します。これにより、アドレス オブジェクトのリストを含む完全なユーザー オブジェクトが読み込まれます。

プロジェクションが Hibernate でどのように機能するかを理解するのに苦労しています。これが私の目標です。ロードする必要がある大きなエンティティがありますが、すべてのデータは必要ありません。いくつかの列とサブコレクションがロードされるだけで、他のすべてのデータは必要ありません。基本的に、限られた量のデータだけで同じオブジェクトをロードしたいと考えています。しかし、User オブジェクトの firstName と lastName は必要ないので、それらは必要ありません。完全なアドレス リストがロードされ、ユーザーの ID を持つ「より軽い」ユーザー オブジェクトが必要です。私の目標は、アドレス リストをロードすることではなく、アドレス リストを持つユーザー オブジェクトをロードすることであることを思い出してください。

私がこれを試してみると:

ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("id"));
criteria = criteria.setProjection(proList);      
criteria.list(); //an Object[] of just the ids

ID のみを取得し、User オブジェクトは取得しません!

私がこれを試してみると:

ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("id"));
proList.add(Projections.property("address"));
criteria = criteria.setProjection(proList);      
criteria.list(); //this actually fails with an Array out of bounds exception

これはただ失敗します!

プロジェクションは、エンティティではなく、必要な正確なデータのみを返すようです。User オブジェクトが部分的に入力されたフィールドで返されることを期待していました。

多分私はこれについて間違っていますか?

4

1 に答える 1

0

あなたは間違っていると思います。本当に達成したいことはわかりませんが、投影よりもマッピングに遅延/プロキシの読み込みが必要なようです。

lazy ="true"プロパティまたはlazy="proxy"コレクションに対して、不要な列へのロード ルールを設定します。次に、コードでそれらを使用しようとするまで、DB からロードされません。

fetch="select"また、フェッチ メソッド ( ) のチェックと、場合によってはバッチ処理についても覚えておいてください。コレクションに大量のデータがあり、一度に表示する必要があるデータの数が少ない場合です。

その射影が必要な場合は、クエリにいくつかの結合があるため、アドレスから開始する必要があります。私のアドバイスは、Hibernate の Cirteria API にクエリを配置するよりも、最初に SQL でクエリを記述してみてください (少なくとも、その仕組みと適切な使用方法を学ぶまでは)。

于 2012-10-31T13:34:43.833 に答える