これは、私が 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 オブジェクトが部分的に入力されたフィールドで返されることを期待していました。
多分私はこれについて間違っていますか?