hibernate的查詢的比較
hibernate的查詢有很多,Query,find,Criteria,get,load
query使用hsql語(yǔ)句,可以設(shè)置參數(shù)是常用的一種方式
criteria的方式,盡量避免了寫hql語(yǔ)句,看起來(lái)更面向?qū)ο罅恕?/p>
find方式,這種方式已經(jīng)被新的hibernate丟棄見這里
http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
get和load方式是根據(jù)id取得一個(gè)記錄
下邊詳細(xì)說(shuō)一下get和load的不同,因?yàn)橛行r(shí)候?yàn)榱藢?duì)比也會(huì)把find加進(jìn)來(lái)。
1,從返回結(jié)果上對(duì)比:
load方式檢索不到的話會(huì)拋出org.hibernate.ObjectNotFoundException異常
get方法檢索不到的話會(huì)返回null
2,從檢索執(zhí)行機(jī)制上對(duì)比:
get方法和find方法都是直接從數(shù)據(jù)庫(kù)中檢索
而load方法的執(zhí)行則比較復(fù)雜
1,首先查找session的persistent Context中是否有緩存,如果有則直接返回
2,如果沒(méi)有則判斷是否是lazy,如果不是直接訪問(wèn)數(shù)據(jù)庫(kù)檢索,查到記錄返回,查不到拋出異常
3,如果是lazy則需要建立代理對(duì)象,對(duì)象的initialized屬性為false,target屬性為null
4, 在訪問(wèn)獲得的代理對(duì)象的屬性時(shí),檢索數(shù)據(jù)庫(kù),如果找到記錄則把該記錄的對(duì)象復(fù)制到代理對(duì)象的target
上,并將initialized=true,如果找不到就拋出異常 。