hibernate -- list和iterator方法的區別


原:http://blog.csdn.net/hanxiaoshuang321123/article/details/7103414

1.首先看兩個例子來比較一下

(1)在用Query方法查詢的時候,通過HQL語句來得到Query對象,並對Query對象進行操作,首先是用list方法獲取到Query的List集合並輸出

public void listQuery() {

       Configuration configuration = new Configuration().configure();

       SessionFactory factory = configuration.buildSessionFactory();

       Session session = factory.openSession(); 

        Query query = session.createQuery("from Customers");

       List<Customers> list = query.list();

       for(Customers entity:list){

           System.out.println(entity.toString());

       }

}

輸出的結果為:

List的執行sql語句為:

Hibernate: select customers0_.id as id0_, customers0_.realName as realName0_, customers0_.pass as pass0_, customers0_.sex as sex0_, customers0_.petName as petName0_, customers0_.email as email0_, customers0_.rdate as rdate0_ from customers customers0_

cn.csdn.products.domain.Customers@5bf624

(2)通過Query得到Query的對象,並用iterator迭代器輸出

    public void iterateQuery(){

       Configuration configuration = new Configuration().configure();

       SessionFactory factory = configuration.buildSessionFactory();

       Session session = factory.openSession();

       Query query = session.createQuery("from Customers");

       Iterator<Customers> it = query.iterate();

       // 遍歷出來所有的查詢結果

       while (it.hasNext()) {

           Customers customer = it.next();

           System.out.println(customer.toString());

       }

    }

Iterator的執行結果:

Hibernate: select customers0_.id as col_0_0_ from customers customers0_

Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ from customers customers0_ where customers0_.id=?

cn.csdn.products.domain.Customers@1d13272

 

結論:

(1)       從上面的執行結果可以看出獲取的方式不一樣

List的獲取方式為:List<Customers> list = query.list();

Iterator的獲取方式:Iterator<Customers> it = query.iterate();

(2)從執行結果可以看出list輸出一條語句,而iterator輸出的是兩條sql語句,我們可想一下,為什么會輸出這樣的效果?

因為他們獲取數據的方式不一樣,list()會直接查詢數據庫,iterator()會先到數據庫中把id都取出來,然后真正要遍歷某個對象的時候先到緩存中找,如果找不到,以id為條件再發一條sql到數據庫,這樣如果緩存中沒有數據,則查詢數據庫的次數為n+1次

(3)list只查詢一級緩存,而iterator會從二級緩存中查

(4)list方法返回的對象都是實體對象,而iterator返回的是代理對象

(5) session中list第二次發出,仍會到數據庫査詢

(6) iterate 第二次,首先找session 級緩存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM