對于list方法而言,實際上Hibernate是通過一條Select SQL獲取所有的記錄。并將其讀出,填入到POJO中返回。而iterate 方法,則是首先通過一條Select SQL 獲取所有符合查詢條件的記錄的id,再對這個id 集合進行循環操作,通過單獨的Select SQL 取出每個id 所對應的記錄,之后填入POJO中返回。也就是說,對于list 操作,需要一條SQL 完成。而對于iterate 操作,需要n+1條SQL。看上去iterate方法似乎有些多余,但在不同的情況下確依然有其獨特的功效,如對海量數據的查詢,如果用list方法將結果集一次取出,內存的開銷可能無法承受。另一方面,對于我們現在的Cache機制而言,list方法將不會從Cache中讀取數據,它總是一次性從數據庫中直接讀出所有符合條件的記錄。而iterate 方法因為每次根據id獲取數據,這樣的實現機制也就為從Cache讀取數據提供了可能,hibernate首先會根據這個id 在本地Cache 內尋找對應的數據,如果沒找到,再去數據庫中檢索。
Query的兩個方法,list() 和 iterate() , 兩個方法都是把結果集列出來, 他們有3點不一樣,1:返回的類型不一樣,list()返回List, iterate()返回Iterator,2: 獲取數據的方式不一樣,list()會直接查數據庫, iterate()會先到數據庫中把id都取出來,然后真正要遍歷某個對象的時候先到緩存中找,如果找不到,以id為條件再發一條sql到數據庫,這樣如果緩存中沒有數據,則查詢數據庫的次數為n+1。
3:iterate會查詢2級緩存, list只會查詢一級緩存。4: list()中返回的List中每個對象都是原本的對象, iterate()中返回的對象是代理對象.(debug可以發現)
新聞熱點
疑難解答