Hibernate 对实体内的子集合休眠投影

Hibernate 对实体内的子集合休眠投影,hibernate,Hibernate,下面是一个非常简单的示例,说明了我试图通过Hibernate和投影来完成的工作。以下是一些示例表: class User{ int id; String firstName; String lastName; List<Address> address ; } class Address{ int id; String city; String state; User user; } 这将工作并返回完整的用户对

下面是一个非常简单的示例,说明了我试图通过Hibernate和投影来完成的工作。以下是一些示例表:

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

class Address{
    int id;
    String city;
    String state;   
    User user;
}
这将工作并返回完整的用户对象和完整的地址列表。这将使用地址对象列表加载完整的用户对象

现在我很难理解投影是如何与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
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
我只得到ID,没有用户对象

如果我尝试这样做:

ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("id"));
criteria = criteria.setProjection(proList);      
criteria.list(); //an Object[] of just the ids
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
这就是失败

似乎投影只返回您想要的确切数据,而不是实体。我希望用户对象返回时包含部分填充的字段


也许我做得不对?

我想你做错了。不确定您真正想要实现什么,但听起来您更需要在映射中加载一些惰性/代理,而不是投影

对于属性,将加载规则设置为不必要的列为
lazy=“true”
;对于集合,将加载规则设置为
lazy=“proxy”
。然后,在您尝试在代码中使用它们之前,它们不会从DB加载

还记得关于检查fetch方法(
fetch=“select”
)和批处理的内容吗?如果您在收集中有很多数据,但一次只需要显示很少的数据

如果需要该投影,应该从Address开始,因为查询中有一些连接。我的建议是——首先尝试用SQL编写查询,然后将其放入Hibernate的Cirteria api中(至少在您了解它的工作原理和正确使用它之前)