->刚才做了个例子试了一下,
->当你使用from Category c left join fetch c.childCategories as c1的时候
->childCategories里面的对象已经载入了,不需要再去写一个外联接后来想想c1其实是Collection,而不是Category了->感觉c1在hql里面不是Collection而是一个Category对象,你可以在where里面用c1.Category的属性=值  来定义查询条件的

解决方案 »

  1.   

    :),谢谢,不过你似乎理解错了,第一层的Collection里面确实是Category,已经取出来了,但这是个嵌套的需求,Collection里面的Category也一样还有Cellection,我是接着往里嵌套的取不出来了,比如第一层是爷爷,2层是父亲,3层是孙子,那么通过爷爷连接是可以把父亲那一辈取出来,但是这辈人的儿子们怎么取呢?
      

  2.   

    对每一个孩子集合使用Hibernate.initialize(parent.getChildren());
    感觉好像没有别的好办法,呵呵
      

  3.   

    我觉得单靠left join取所有的子孙(虽然楼主只想取到孙子层)是行不通的.
      

  4.   

    from Father f left join fetch f.son as s left join fetch s.grandson as gHibernate: select father0_.father_id as father1_0_, son1_.son_id as son1_1_, grandson2_.grand_id as grand1_2_, father0_.name as name0_0_, son1_.name as name1_1_, son1_.fatherId as fatherId1_1_, son1_.fatherId as fatherId0__, son1_.son_id as son1_0__, grandson2_.grandsonName as grandson2_2_2_, grandson2_.sonId as sonId2_2_, grandson2_.sonId as sonId1__, grandson2_.grand_id as grand1_1__ from father father0_ left outer join son son1_ on father0_.father_id=son1_.fatherId left outer join grandson grandson2_ on son1_.son_id=grandson2_.sonId这是生成的sql
      

  5.   

    在同一张表里面没有试过,代码主干贴出来看一下,我得下层是一个集合<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping>
    <class name="com.softbrain.wangzl.hibernate.children.Father" table="father">
    <id name="fatherId" column="father_id">
    <generator class="increment">
    </generator>
    </id>
    <property name="fatherName" column="name">
    </property>

    <set name="son" table="son" inverse="true" cascade="all" lazy="true">
    <key>
    <column name="fatherId">
    </column>
    </key>
    <one-to-many class="com.softbrain.wangzl.hibernate.children.Son"></one-to-many>
    </set>
    </class>
    </hibernate-mapping>public class Father {
        private Set son = new HashSet();
        private Integer fatherId;
        private String fatherName = null;
        
        /**
         * @return Returns the fatherId.
         */
        public Integer getFatherId() {
            return fatherId;
        }
        /**
         * @param fatherId The fatherId to set.
         */
        public void setFatherId(Integer fatherId) {
            this.fatherId = fatherId;
        }
        /**
         * @return Returns the fatherName.
         */
        public String getFatherName() {
            return fatherName;
        }
        /**
         * @param fatherName The fatherName to set.
         */
        public void setFatherName(String fatherName) {
            this.fatherName = fatherName;
        }
        /**
         * @return Returns the son.
         */
        public Set getSon() {
            return son;
        }
        /**
         * @param son The son to set.
         */
        public void setSon(Set son) {
            this.son = son;
        }
    }
      

  6.   

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping>
    <class name="com.softbrain.wangzl.hibernate.children.Son" table="son">
    <id name="sonId" column="son_id">
    <generator class="increment">
    </generator>
    </id>
    <property name="sonName" column="name">
    </property>

    <set name="grandson" table="grandson" inverse="true" cascade="all" lazy="true">
    <key>
    <column name="sonId">
    </column>
    </key>
    <one-to-many class="com.softbrain.wangzl.hibernate.children.Grandson"></one-to-many>
    </set>

    <many-to-one name="father" class="com.softbrain.wangzl.hibernate.children.Father" column="fatherId">
    </many-to-one>
    </class>
    </hibernate-mapping>public class Son {
        private Set grandson = new HashSet();
        private Father father = null;
        /**
         * @return Returns the father.
         */
        public Father getFather() {
            return father;
        }
        /**
         * @param father The father to set.
         */
        public void setFather(Father father) {
            this.father = father;
        }
        private Integer sonId;
        private Integer fatherId;
        private String sonName = null;
        
        /**
         * @return Returns the fatherId.
         */
        public Integer getFatherId() {
            return fatherId;
        }
        /**
         * @param fatherId The fatherId to set.
         */
        public void setFatherId(Integer fatherId) {
            this.fatherId = fatherId;
        }
        /**
         * @return Returns the grandson.
         */
        public Set getGrandson() {
            return grandson;
        }
        /**
         * @param grandson The grandson to set.
         */
        public void setGrandson(Set grandson) {
            this.grandson = grandson;
        }
        /**
         * @return Returns the sonId.
         */
        public Integer getSonId() {
            return sonId;
        }
        /**
         * @param sonId The sonId to set.
         */
        public void setSonId(Integer sonId) {
            this.sonId = sonId;
        }
        
        /**
         * @return Returns the sonname.
         */
        public String getSonName() {
            return sonName;
        }
        /**
         * @param sonname The sonname to set.
         */
        public void setSonName(String sonName) {
            this.sonName = sonName;
        }
    }
      

  7.   

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping>
    <class name="com.softbrain.wangzl.hibernate.children.Grandson" table="grandson">
    <id name="grandsonId" column="grand_id">
    <generator class="increment">
    </generator>
    </id>
    <property name="grandsonName">
    </property>
    <many-to-one name="son" class="com.softbrain.wangzl.hibernate.children.Son" column="sonId">
    </many-to-one>
    </class>
    </hibernate-mapping>public class Grandson {
        private Integer grandsonId;
        private Integer sonId;
        private String grandsonName = null;
        private Son son = null;
        
        /**
         * @return Returns the son.
         */
        public Son getSon() {
            return son;
        }
        /**
         * @param son The son to set.
         */
        public void setSon(Son son) {
            this.son = son;
        }    /**
         * @return Returns the sonId.
         */
        public Integer getSonId() {
            return sonId;
        }
        /**
         * @param sonId The sonId to set.
         */
        public void setSonId(Integer sonId) {
            this.sonId = sonId;
        }
        /**
         * @return Returns the grandsonId.
         */
        public Integer getGrandsonId() {
            return grandsonId;
        }
        /**
         * @param grandsonId The grandsonId to set.
         */
        public void setGrandsonId(Integer grandsonId) {
            this.grandsonId = grandsonId;
        }
        /**
         * @return Returns the grandsonName.
         */
        public String getGrandsonName() {
            return grandsonName;
        }
        /**
         * @param grandsonName The grandsonName to set.
         */
        public void setGrandsonName(String grandsonName) {
            this.grandsonName = grandsonName;
        }
    }
      

  8.   

    Configuration conf = new Configuration().configure();
            SessionFactory sf = conf.buildSessionFactory();
            
            Session session = sf.openSession();
            Transaction t = session.beginTransaction();
            
    //        Father father = new Father();
    //        father.setFatherName("father");
    //        
    //        Son son1 = new Son();
    //        Son son2 = new Son();
    //        son1.setSonName("son1");
    //        son1.setFather(father);
    //        son2.setSonName("son2");
    //        son2.setFather(father);
    //        
    //        Grandson grandson1 = new Grandson();
    //        Grandson grandson2 = new Grandson();
    //        Grandson grandson3 = new Grandson();
    //        Grandson grandson4 = new Grandson();
    //        
    //        grandson1.setGrandsonName("grandson1");
    //        grandson1.setSon(son1);
    //        grandson2.setGrandsonName("grandson2");
    //        grandson2.setSon(son1);
    //        grandson3.setGrandsonName("grandson3");
    //        grandson3.setSon(son2);
    //        grandson4.setGrandsonName("grandson4");
    //        grandson4.setSon(son2);
    //        
    //        son1.getGrandson().add(grandson1);
    //        son1.getGrandson().add(grandson2);
    //        son2.getGrandson().add(grandson3);
    //        son2.getGrandson().add(grandson4);
    //        
    //        father.getSon().add(son1);
    //        father.getSon().add(son2);
    //        
    //        session.save(father);
    //        t.commit();
            
            String hql = "from Father f left join fetch f.son as s left join fetch s.grandson as g";
            
            Query query = session.createQuery(hql);
            
            List list = query.list(); 
            Son son = ((Son)(((Father)list.get(0)).getSon().toArray()[0]));
            Grandson grandson = (Grandson) son.getGrandson().toArray()[0];
            
            System.out.println(grandson.getGrandsonName());