Hibernate 抓取策略Fetch

来源:互联网 发布:java网上报名系统源码 编辑:程序博客网 时间:2024/06/04 09:25
lazy与fetch   如果fetch为"join"lazy不论设置成什么样的值,都不起作用   如果fetch为"select",先加载classes,再加载student,而lazy决定在什么时候加载student
public class FetchTest  extends HibernateUtil{    /**     * 1.把classes表中所有的数据查询出来     * 2.再根据每一个CID,去student表中查询     * 抓取策略默认值是select,n+1sql语句     *  <set name="students" inverse="true" fetch="select">     * */    @Test    public void getAllClassesAndStudents(){        Session session=sessionFactory.openSession();        List<Classes> classes=session.createQuery("from com.sanmao.utils.Classes").list();        for (Classes c: classes) {            Set<Student> students=c.getStudents();            for (Student s: students) {                System.out.println(s);            }        }    }/** *  <set name="students" inverse="true" fetch="subselect"> * * select * from Student where cid in (select cid from Classes ) 调用了子查询 但是这种策略,在一定程度上也不能使用,在不包含子查询的需求内 例如 查询CID为1 的班级的所有学生,就不能用子查询了 */    @Test    public void getAllClassesAndStudents_SubSelect(){        Session session=sessionFactory.openSession();        List<Classes> classes=session.createQuery("from com.sanmao.utils.Classes").list();        for (Classes c: classes) {            Set<Student> students=c.getStudents();            for (Student s: students) {                System.out.println(s);            }        }    }    /**     * <set name="students" inverse="true" fetch="join">     * 在包含子查询的查询中,用join 无效,和默认select效果一样     * 在不包含子查询的查询中 ,join能实现优化     * 所有万能select(效率低),包含子查询用subselect,不包含用join     * */    @Test    public void getAllClassesAndStudents_Join(){        Session session=sessionFactory.openSession();        List<Classes> classes=session.createQuery("from com.sanmao.utils.Classes").list();        for (Classes c: classes) {            Set<Student> students=c.getStudents();            for (Student s: students) {                System.out.println(s);            }        }    }    /**     * select c  from Classes  left outer join  Student     on classes0_.cid=students1_.cid     where     classes0_.cid=?     * */    @Test    public void getAllClassesAndStudents_Join2(){        Session session=sessionFactory.openSession();        Classes c=(Classes) session.get(Classes.class,1L);        Set<Student> students=c.getStudents();        for (Student s: students) {                System.out.println(s);        }        session.close();    }}
0 0
原创粉丝点击