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