代码之家  ›  专栏  ›  技术社区  ›  MR AND

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

  •  0
  • MR AND  · 技术社区  · 6 年前
    class User{
        int id;
        String firstName;
        String lastName;
        List<Address> address ;
    }
    
    class Address{
        int id;
        String city;
        String state;   
    }
    

    我想使用hibernate标准或HQL从Address类加载部分数据。在这种情况下,我只想从address类加载地址id和状态。我意识到我可以使用投影部分加载数据,但我不知道如何处理address类。

    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")
    

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

    由于用户类中没有object address.id,我收到错误消息。如果能在这方面得到任何帮助,我将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Paco Abato    6 年前

    您可以创建一个新类,比如AddressId,它只包含一个Long属性。将这个新类正确映射到地址表。将AddressId列表添加到用户类。使用投影加载此新列表,而不是另一个列表。

        2
  •  0
  •   MR AND    6 年前

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

    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();
            }
    

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

    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);
    

    这将只加载我们需要的数据。