Hibernate 中 load方法與get方法以及Query查詢與Criteria查詢

    原本以前學過Hibernate的,可是近期接到一個項目,爲了方便開發,還有考慮到對Hibernate的不足,從新花了4天由淺入深學了下。 數據庫

    在此,Hibernate裏面涉及到多種查詢的方法,可是每一個方法特性並不同,經常使用的就基本有四種,固然,或許本人還學的不過廣,可是通過各類百度谷歌,主要出現就是這四種,load,get,Query,Criteria。 緩存

    首先說下load與get的區別:  fetch

    load方法得到的是對應參數的類的代理對象,看清楚,是代理對象,而get方法是對應參數的類的對象。這兩種有神馬區別,load方法得到的代理對象,若是你沒有對其調用裏面的方法等等,Hibernate是不會發出SQL語句去查詢數據庫裏面的內容,可是get方法一使用,Hibernate立馬就發出SQL語句去查詢數據庫裏面的內容。這意味着,會出現,當數據庫中沒有對應Id的數據存在時,get方法是返回null值,這很好,對咱們的程序影響並不大,但是load的話,由於一開始是得到代理對象,因此並不是null值,這樣你不能知道到底數據庫有沒有該數據存在,只有當你使用該代理對象的時候,Hibernate才發出SQL語句,這時當數據庫沒有該數據,那麼系統就會報ObjectNotFoundException異常。還有,當你調用完了相應的方法時關閉了Session,那麼get方法沒有影響,而load方法會出現異常。  代理

    get的話,會到一級緩存查找是否已存在的對象,而load會先從一級緩存查找再到二級緩存查找。  對象


    接下來講下Query和Criteria查詢的區別: 開發

    最明顯的區別在於,Query是HQL\EJB QL 語言進行查詢的,格式很像SQL語句,不過HQL\EJB QL是符合OO查詢的,也就是SQL裏面指定表名而HQL是指定類名,格式我就不在這裏多寫。而Criteria呢是經過要查找的類做爲參數進行查詢,這中類型跟load和get類似,再經過添加約束來進一步實現查詢。 get

    還有一個區別,Criteria對於一對多多對一關係不會出現N+1問題,而Query則會出現該問題,固然Query能夠進行限制來防止這種狀況發生,例如設置fetch爲Lazy,或是在HQL加上left join鏈接,或是使用BethSize(不推薦,靈活性差)  it

相關文章
相關標籤/搜索