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.
(返回的實體只有在使用時才會被初始化,執行該方法查詢時只會返回實體的識別符號(即
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中的物件進行操作時,
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 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