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

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

 
 
@Test
	public 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迭代器输出

@Test
	public 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返回的是代理对象



你可能感兴趣的:(Hibernate--- list和iterator方法的区别)