【问题标题】:Hibernate - How to fetch a child collection?Hibernate - 如何获取子集合?
【发布时间】:2016-12-16 10:51:47
【问题描述】:

我希望我的 HQL 查询返回一个对象及其子集合。

hbm:

<class name="Object" table="OBJECT">

<id name="id" column="IDOBJECT" type="long" access="field">
<generator class="sequence">
    <param name="sequence">OBJECT_SEQ</param>
</generator>
</id>

<many-to-one name="parent" column="IDPARENT" class="Parent" embed-xml="true" />

<set name="children" inverse="true" cascade="all-delete-orphan">   
    <key column="IDOBJECT" />
    <one-to-many class="Child" />
</set>

查询:

SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children

最后:

  • o.parent 已获取

  • o.children 为空

儿童在数据库中并与返回的对象相关联。

【问题讨论】:

    标签: hibernate collections set hql


    【解决方案1】:

    我用基于注释的方式测试了你的数据库结构,一切都很好。在你这边测试一下,看看你错过了什么:

    孩子:

    @Entity
    @Table(name = "child")
    @XmlRootElement
    public class Child implements Serializable {
    
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id")
        private Integer id;
        @Size(max = 255)
        @Column(name = "name")
        private String name;
        @JoinColumn(name = "idobject", referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY)
        private entity.Object object;
    
        public Child() {
        }
    
        public Child(Integer id) {
            this.id = id;
        }
    
        //getter and setters
    }
    

    对象:

    @Entity
    @Table(name = "object")
    @XmlRootElement
    public class Object implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id")
        private Integer id;
        @Size(max = 255)
        @Column(name = "name")
        private String name;
        @OneToMany(mappedBy = "object", fetch = FetchType.LAZY)
        private List<Child> children;
        @JoinColumn(name = "idparent", referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY)
        private Parent parent;
    
        public Object() {
        }
    
        public Object(Integer id) {
            this.id = id;
        }
        //getter and setter
    }
    

    家长:

    @Entity
    @Table(name = "parent")
    @XmlRootElement
    public class Parent implements Serializable {
    
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id")
        private Integer id;
        @Size(max = 255)
        @Column(name = "name")
        private String name;
        @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
        private List<entity.Object> objects;
    
        public Parent() {
        }
    
        public Parent(Integer id) {
            this.id = id;
        }
    //getter and setters
    }
    

    和我的查询:

       public class ObjectDao { 
    
        public static List<Object> getObjects() {
            EntityManager em = Persistence.createEntityManagerFactory("test").createEntityManager();
            try {
                Query query = em.createQuery("SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children");
                List l =  query.getResultList();
                return l;
            } catch (Exception ex) {
                ex.printStackTrace();
                return new ArrayList<Object>();
            } finally {
                em.close();
            }
        }
    }
    

    我用于调试的 servlet:

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        List<entity.Object> objects = ObjectDao.getObjects();
        for (entity.Object obj : objects) {
            System.out.println("object name:" + obj.getName());
            System.out.println("parent name:" + obj.getParent().getName());
            List<Child> children = obj.getChildren();
            System.out.println("children:");
            for(Child c: children){
                System.out.println(c.getName());
            }
        }
    }
    

    结果是:

    object name:Object 1
    parent name:Parent 1
    children:
    Child Name
    

    【讨论】:

    • 谢谢你的回答我会尝试使用它并找出问题所在。解决后我会发布一些东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多