1. 程式人生 > >Query的list()和iterate()方法的區別

Query的list()和iterate()方法的區別

1.Query介面的list與iterate方法:

iterate()方法:

Return the query results as an Iterator. Ifthe query contains multiple results pre row, the results are returned in aninstance ofObject[].
Entities returned as results are initialized ondemand. The first SQL query returns identifiers only.

(返回的實體只有在使用時才會被初始化,執行該方法查詢時只會返回實體的識別符號(即

id))

list()方法:

Return the query results as a List. If thequery contains multiple results pre row, the results are returned in aninstance ofObject[].

2.兩者區別:

對於Query介面的list()方法與iterate()方法來說,都可以實現獲取查詢的物件,但是list()方法返回的每個物件都是完整的(物件中的每個屬性都被表中的欄位填充上了),而iterator()方法所返回的物件中僅包含了主鍵值(識別符號),只有當你對iterator中的物件進行操作時,

Hibernate才會向資料庫再次傳送SQL語句來獲取該物件的屬性值。

3. 例:

Session session =sessionFactory.openSession();

Transaction tx =null;

//List<People> list = null;

Iterator<People> iter = null;

try

{

tx= session.beginTransaction();

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

/*使用iterate方法

Iterator<People> iter

= (Iterator<People>)query.iterate();

while(iter.hasNext())

{

session.delete(iter.next());

}

*/

//關於這兩種刪除資料庫中的記錄的方式的效率的對比(假如共查到5條記錄):

// iterate()方法:執行6條select語句和5條delete語句

//list()方法:執行1條select語句和5條delete語句

// 此時list的效率比較高

//使用list方法

//list = (List<People>)query.list();

//  for(Iterator<People> iter = list.iterator(); iter.hasNext();)

//  {

//      session.delete(iter.next());

//  }

//session關閉之前呼叫iterate方法在session關閉後再用iter訪問people物件以證明iterate方法沒有返回完整的物件

iter = (Iterator<People>)query.iterate();

tx.commit();

}catch(Exception ex)

{

if(null != tx)

{tx.rollback();}

}finally

{session.close();}

//在session關閉之後就不可能再向資料庫傳送SQl語句來獲取物件的屬性(即填充完整物件),則會丟擲SessionException異常提示"Session is closed!"

while(iter.hasNext())

{

System.out.println(iter.next().getId());

}

關於Query介面的其它方法,詳見API幫助文件

轉載請註明出處:http://blog.csdn.net/jialinqiang/article/details/8718437