2013年7月3日 星期三

Hibernate Query list() vs iterator()

初次使用Hibernate時,

常會使用到這兩個查詢方式,

網路查詢到的資料有些不是很正確,

這邊分享一些自己看Hibernate實戰的心得,

查詢方式

list():

只會送出一條SQL,將結果集都存在一級和二級緩存(有開的話),



但是不會使用緩存,也就是說你每次執行這個方法都丟出一個SQL給資料庫。

iterator():

第一次查詢時會把所有的id查出來,

等到真正要調用對象的時候,會先看緩存有沒有(一、二級),

沒有的話才會去資料庫調用,

有可能會造成N+1條SQL查詢,

且返回的對象為代理對象。

實際應用

在使用上你可以用下面的code達到一條SQL查詢,
但仍然可以使用iterator的模式,

  Session session=sf.openSession();
  Query query=session.createQuery("from Employee");
  List list=query.list();
  Iterator it=list.iterator();

第一次list的查詢會填充一、二級緩存,

而iterator就可以調用其中的緩存資料,

也不會產生N+1條SQL去向資料庫查詢資料。

沒有留言:

張貼留言