Hibernate--- list和iterator方法的区别

来源:互联网 发布:淘宝买家秀木耳图链接 编辑:程序博客网 时间:2024/06/04 20:03

1)用HQL语句,使用Query对象来获取list()方法

@Testpublic void list1() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 2.查询的时候事务可以写可以不写String hql = "from Emp";// 3.获得Query对象Query query = session.createQuery(hql);// 4.获得list对象List<Emp> list = query.list();// 5.遍历数据for (Emp emp : list) {System.out.println(emp.getEmpno() + "\t" + emp.getEname() + "\t"+ emp.getJob() + "\t" + emp.getSal() + "\t"+ emp.getHiredate());}// 6.将会话关闭session.close();}


List的执行sql语句为:

    select        emp0_.EMPNO as EMPNO1_1_,        emp0_.DEPTNO as DEPTNO2_1_,        emp0_.ENAME as ENAME3_1_,        emp0_.JOB as JOB4_1_,        emp0_.MGR as MGR5_1_,        emp0_.HIREDATE as HIREDATE6_1_,        emp0_.SAL as SAL7_1_,        emp0_.COMM as COMM8_1_     from        WY.EMP emp0_

(2)通过Query得到Query的对象,并用iterator迭代器输出

@Testpublic void list2() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 2.查询的时候事务可以写可以不写String hql = "from Emp";// 3.获得Query对象Query query = session.createQuery(hql);// 4.获得Iterator对象Iterator<Emp> list = query.iterate();// 5.遍历数据while (list.hasNext()) {Emp emp = list.next();System.out.println(emp.getEmpno() + "\t" + emp.getEname() + "\t"+ emp.getJob() + "\t" + emp.getSal() + "\t"+ emp.getHiredate() + "\t" + emp.getDept().getDeptno());}// 6.将会话关闭session.close();}
Iterator的执行sql语句为:

Hibernate: 
    select
        emp0_.EMPNO as col_0_0_ 
    from
        WY.EMP emp0_
Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_1_0_,
        emp0_.DEPTNO as DEPTNO2_1_0_,
        emp0_.ENAME as ENAME3_1_0_,
        emp0_.JOB as JOB4_1_0_,
        emp0_.MGR as MGR5_1_0_,
        emp0_.HIREDATE as HIREDATE6_1_0_,
        emp0_.SAL as SAL7_1_0_,
        emp0_.COMM as COMM8_1_0_ 
    from
        WY.EMP emp0_ 
    where
        emp0_.EMPNO=?

结论:

(1) 从上面的执行结果可以看出获取的方式不一样

                   List的获取方式为: List<Emp> list = query.list();

                   Iterator的获取方式: Iterator<Emp>list = query.iterate();

         (2)从执行结果可以看出list输出一条语句,而iterator输出的是两条sql语句,为什么会输出这样的效果?

                 因为他们获取数据的方式不一样,list()会直接查询数据库,iterator()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓               存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1次

       (3)list只查询一级缓存,而iterator会从二级缓存中查

       (4)list方法返回的对象都是实体对象,而iterator返回的是代理对象



0 0
原创粉丝点击