这是我试图用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对象和Address对象列表。
现在我无法理解投影如何使用Hibernate。这是我的目标。我有大型的实体,我必须加载,但我不需要所有的数据,我只需要加载几列和一个子集合,我不需要所有其他数据。基本上我想加载相同的对象只是有限的数据量。但是,我不需要用户对象的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和无用户对象!
如果我试试这个:
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
这只是失败!
看起来投影只会返回您想要的确切数据而不是实体。我期待用户对象返回部分填充字段。
也许我正在错误地解决这个问题?