query的list()和iterate()区别

1.返回的类型不一样,list返回List,iterate返回iterator

query的list()和iterate()区别    面试题-LMLPHPquery的list()和iterate()区别    面试题-LMLPHP

2.查询策略不同。

获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中把id取出来,然后真正要遍历某个对象的时候先到缓存中找

,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1

 @Test
public void fetchAndList(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Query query=session.createQuery("from Emp");
List<Emp> list=query.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
System.out.println("==========================================");
//fetch
System.out.println(emp.getDept().getDeptName());
} //
// Iterator ite = query.iterate();
//
// System.out.println("====================================");
// while(ite.hasNext()){
// System.out.println(ite.next());
//
// }
// tx.commit();
HibernateUtil.closeSession();
}

list查询结果

query的list()和iterate()区别    面试题-LMLPHP

iterate测试结果

query的list()和iterate()区别    面试题-LMLPHP

3.iterate会查询2级缓存,list只会缓存,但不会使用缓存(除非结合查询缓存)。

4.list中返回的list中每个对象都是原本的对象,iterate中返回的对象是代理对象

代码解析:

/**
* list()和iterate()方法的区别
*
* 区别一:查询策略不同。
* **/
@Test
public void one(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Query query=session.createQuery("from Emp");
List<Emp> list=query.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
System.out.println("==========================================");
//fetch
System.out.println(emp.getDept().getDeptName());
} // Iterator ite = query.iterate();
//
// System.out.println("====================================");
// while(ite.hasNext()){
// System.out.println(ite.next());
//
// } tx.commit();
HibernateUtil.closeSession();
} /**
* 区别二:iterate会查询2级缓存,list只会缓存,但不会使用缓存(除非结合查询缓存)。
* **/
@Test
public void two(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); /**
* 一级缓存
* **/ /*List<Emp> list = session.createQuery("from Emp").list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
System.out.println("==================================="); List<Emp> list2 = session.createQuery("from Emp").list();
for (Emp emp : list2) {
System.out.println(emp.getEmpName());
}*/ /*Iterator iterate = session.createQuery("from Emp").iterate();
while(iterate.hasNext()){
System.out.println(iterate.next());
}
System.out.println("=====================================");
Iterator iterates = session.createQuery("from Emp").iterate();
while(iterates.hasNext()){
System.out.println(iterates.next());
}*/ /**
* 二级缓存
* **/ /*List<Emp> list = session.createQuery("from Emp").list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
} HibernateUtil.closeSession();
Session session2 = HibernateUtil.currentSession();
Transaction tx2 = session2.beginTransaction();
System.out.println("==================================="); List<Emp> list2 = session2.createQuery("from Emp").list();
for (Emp emp : list2) {
System.out.println(emp.getEmpName());
} tx2.commit();*/ /*
Iterator iterate = session.createQuery("from Emp").iterate();
while(iterate.hasNext()){
System.out.println(iterate.next());
}
HibernateUtil.closeSession(); System.out.println("====================================="); Session session2 = HibernateUtil.currentSession();
Transaction tx2 = session2.beginTransaction();
Iterator iterates = session2.createQuery("from Emp").iterate();
while(iterates.hasNext()){
System.out.println(iterates.next());
} tx2.commit();*/ /**
* 查询缓存
* **/
List<Dept> list =(List<Dept>) session.createQuery("from Dept").setCacheable(true).list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
} System.out.println("========================================");
List<Dept> list2 =(List<Dept>) session.createQuery("from Dept").setCacheable(true).list();
for (Dept dept : list2) {
System.out.println(dept.getDeptName());
} HibernateUtil.closeSession(); } /**
*区别三: list中返回的list中每个对象都是原本的对象,iterate中返回的对象是代理对象
* */
@Test
public void three(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Query query=session.createQuery("from Emp");
//不存在延迟加载
// List<Emp> list=query.list(); //存在延迟加载
Iterator iterate = query.iterate(); tx.commit();
HibernateUtil.closeSession(); }
05-12 15:03