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