hibernate抓取策略(集合代理的批量抓取) 设置fetch= " subselect ",如: < set name= " students " inverse= " true " cascade= " all " fetch= " subselect "> fetch= " subselect ",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合 ============================================================================ testFetch1: public void testFetch1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Classes classes = (Classes)session.load(Classes. class, 1); System. out.println( " classes.name= " + classes.getName()); for (Iterator iter=classes.getStudents().iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System. out.println( " student.name= " + student.getName()); } session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from t_classes classes0_ where classes0_.id=? classes.name=班级0 Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classesid as classesid1_0_ from t_student students0_ where students0_.classesid=? student.name=班级0的学生6 student.name=班级0的学生1 student.name=班级0的学生5 student.name=班级0的学生4 student.name=班级0的学生0 student.name=班级0的学生2 student.name=班级0的学生3 ====================================影响hql查询======================================= testFetch2: /* * * Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, * students0_.id as id1_0_, students0_.name as name1_0_, * students0_.classesid as classesid1_0_ * from t_student students0_ * where students0_.classesid in (select classes0_.id from t_classes classes0_ where classes0_.id in (1 , 2 , 3)) */ public void testFetch2() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); List classesList = session.createQuery( " select c from Classes c where c.id in(1, 2, 3) ").list(); for (Iterator iter=classesList.iterator(); iter.hasNext();) { Classes classes = (Classes)iter.next(); System. out.println( " classes.name= " + classes.getName()); for (Iterator iter1=classes.getStudents().iterator(); iter1.hasNext();) { Student student = (Student)iter1.next(); System. out.println( " student.name= " + student.getName()); } } session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } 设置:< set name= " students " inverse= " true " cascade= " all "> Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from t_classes classes0_ where classes0_.id in ( 1 , 2 , 3) classes.name=班级0 Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classesid as classesid1_0_ from t_student students0_ where students0_.classesid=? student.name=班级0的学生2 student.name=班级0的学生1 student.name=班级0的学生6 student.name=班级0的学生5 student.name=班级0的学生4 student.name=班级0的学生3 student.name=班级0的学生0 classes.name=班级1 Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classesid as classesid1_0_ from t_student students0_ where students0_.classesid=? student.name=班级1的学生2 student.name=班级1的学生0 student.name=班级1的学生5 student.name=班级1的学生6 student.name=班级1的学生4 student.name=班级1的学生1 student.name=班级1的学生3 classes.name=班级2 Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classesid as classesid1_0_ from t_student students0_ where students0_.classesid=? student.name=班级2的学生2 student.name=班级2的学生0 student.name=班级2的学生3 student.name=班级2的学生1 student.name=班级2的学生4 student.name=班级2的学生6 student.name=班级2的学生5 设置:< set name= " students " inverse= " true " cascade= " all " fetch= " subselect "> Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from t_classes classes0_ where classes0_.id in ( 1 , 2 , 3) classes.name=班级0 Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classesid as classesid1_0_ from t_student students0_ where students0_.classesid in ( select classes0_.id from t_classes classes0_ where classes0_.id in ( 1 , 2 , 3)) student.name=班级0的学生2 student.name=班级0的学生1 student.name=班级0的学生5 student.name=班级0的学生6 student.name=班级0的学生4 student.name=班级0的学生0 student.name=班级0的学生3 classes.name=班级1 student.name=班级1的学生4 student.name=班级1的学生5 student.name=班级1的学生3 student.name=班级1的学生2 student.name=班级1的学生6 student.name=班级1的学生0 student.name=班级1的学生1 classes.name=班级2 student.name=班级2的学生5 student.name=班级2的学生4 student.name=班级2的学生0 student.name=班级2的学生3 student.name=班级2的学生1 student.name=班级2的学生6 student.name=班级2的学生2