使用休眠投影在子对象中加载部分数据

时间:2019-01-03 15:43:13

标签: java hibernate

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

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

我想使用休眠条件或HQL从Address类加载部分数据。在这种情况下,我只想从Address类加载地址ID和状态。我意识到我可以使用投影来部分加载数据,但是我不知道该如何处理地址类。

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(Projections.projectionList()
.add(Projections.property("id"),"id")
.add(Projections.property("firstName"),"firstName")
.add(Projections.property("address"),"address")

如果我尝试使用投影来限制Address类中的数据加载

.add(Projections.property("address.id"),"address.id")

由于用户类中没有对象address.id,我得到了错误。在此方面,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以创建一个新类,例如AddressId,该类仅包含Long属性。将此新类正确映射到地址表。将AddressId列表添加到User类。使用投影加载此新列表,而不是其他列表。

答案 1 :(得分:0)

我使用休眠查询语言(HQL)来获得所需的结果。

首先,我实例化用户类并添加了一个新的构造函数,如下所示

List<User> userList = new ArrayList<User>();

        try {
            session = HibernateUtil.getSession();
            String hql = "select new User(user.id, user.firstName, user.address.id, user.address.state " 
                    + "from User user where user.id in (:userIdList) ";
            Query q = session.createQuery(hql);
            q.setParameterList("userIdList",userIdList);
            userList=q.list();
            session.flush();
        }

然后我们需要将User的构造函数更新为:

public User(int id, String firstName, int addressId, String state) {
    this.id = id;
    this.firstName = firstName;
    this.address = new Address();
    this.address.setState(state);
    this.address.setId(addressId);

这只会加载我们想要的数据。