久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔
站長(zhǎng)百科 | 數(shù)字化技能提升教程 數(shù)字化時(shí)代生存寶典
首頁(yè)
數(shù)字化百科
電子書(shū)
建站程序
開(kāi)發(fā)
服務(wù)器
辦公軟件
開(kāi)發(fā)教程
服務(wù)器教程
軟件使用教程
運(yùn)營(yíng)教程
熱門電子書(shū)
WordPress教程
寶塔面板教程
CSS教程
Shopify教程
導(dǎo)航
程序頻道
推廣頻道
網(wǎng)賺頻道
人物頻道
網(wǎng)站程序
網(wǎng)頁(yè)制作
云計(jì)算
服務(wù)器
CMS
論壇
網(wǎng)店
虛擬主機(jī)
cPanel
網(wǎng)址導(dǎo)航
WIKI使用導(dǎo)航
WIKI首頁(yè)
最新資訊
網(wǎng)站程序
站長(zhǎng)人物
頁(yè)面分類
使用幫助
編輯測(cè)試
創(chuàng)建條目
網(wǎng)站地圖
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)百科
主機(jī)偵探
IDCtalk云說(shuō)
跨境電商導(dǎo)航
WordPress啦
站長(zhǎng)專題
網(wǎng)站推廣
網(wǎng)站程序
網(wǎng)站賺錢
虛擬主機(jī)
cPanel
網(wǎng)址導(dǎo)航專題
云計(jì)算
微博營(yíng)銷
虛擬主機(jī)管理系統(tǒng)
開(kāi)放平臺(tái)
WIKI程序與應(yīng)用
美國(guó)十大主機(jī)
編輯“
HQL
”
人物百科
|
營(yíng)銷百科
|
網(wǎng)賺百科
|
站長(zhǎng)工具
|
網(wǎng)站程序
|
域名主機(jī)
|
互聯(lián)網(wǎng)公司
|
分類索引
跳轉(zhuǎn)至:
導(dǎo)航
、?
搜索
警告:
您沒(méi)有登錄。如果您做出任意編輯,您的IP地址將會(huì)公開(kāi)可見(jiàn)。如果您
登錄
或
創(chuàng)建
一個(gè)賬戶,您的編輯將歸屬于您的用戶名,且將享受其他好處。
反垃圾檢查。
不要
加入這個(gè)!
[[Image:hibernet.jpg|right|200px|thumb|hibernet[[logo]]]] '''HQL''' 是Hibernate Query Language的簡(jiǎn)寫,即 [[hibernate]] 查詢語(yǔ)言:HQL采用[[面向?qū)ο骫]的查詢方式。HQL查詢提供了更加豐富的和靈活的查詢特性,因此Hibernate將HQL查詢方式立為官方推薦的標(biāo)準(zhǔn)查詢方式,HQL查詢?cè)诤w[[Criteria]]查詢的所有功能的前提下,提供了類似標(biāo)準(zhǔn)SQL語(yǔ)句的查詢方式,同時(shí)也提供了更加面向?qū)ο蟮腫[封裝]]。 == HQL的用法 == 一個(gè)完整的HQL語(yǔ)句形式如下: <pre> Select/update/delete……from……where……groupby……h(huán)aving……orderby……asc/desc </pre> 其中的update/delete為Hibernate3中所新添加的功能,可見(jiàn)HQL查詢非常類似于標(biāo)準(zhǔn)SQL查詢。由于HQL查詢?cè)谡麄€(gè)Hibernate實(shí)體操作體系中的核心地位,這一節(jié)我將專門圍繞HQL操作的具體技術(shù)細(xì)節(jié)進(jìn)行講解。 ===實(shí)體查詢=== *有關(guān)實(shí)體查詢技術(shù),其實(shí)我們?cè)谙惹耙呀?jīng)有多次涉及,比如下面的例子: <pre> String hql=”from User user”; List list=session.CreateQuery(hql).list(); </pre> *上面的代碼執(zhí)行結(jié)果是,查詢出User實(shí)體對(duì)象所對(duì)應(yīng)的所有數(shù)據(jù),而且將數(shù)據(jù)封裝成User實(shí)體對(duì)象,并且放入List中返回。這里需要注意的是,Hibernate的實(shí)體查詢存在著對(duì)繼承關(guān)系的判定 *比如討論映射實(shí)體繼承關(guān)系中的Employee實(shí)體對(duì)象,它有兩個(gè)子類分別是HourlyEmployee,SalariedEmployee,如果有這樣的HQL語(yǔ)句:from Employee *當(dāng)執(zhí)行檢索時(shí)Hibernate會(huì)檢索出所有Employee類型實(shí)體對(duì)象所對(duì)應(yīng)的數(shù)據(jù)(包括它的子類HourlyEmployee,SalariedEmployee對(duì)應(yīng)的數(shù)據(jù))。 *因?yàn)镠QL語(yǔ)句與標(biāo)準(zhǔn)SQL語(yǔ)句相似,所以我們也可以在HQL語(yǔ)句中使用where字句,并且可以在where字句中使用各種表達(dá)式,比較操作符以及使用“and”,”or”連接不同的查詢條件的組合。 <pre> from User user where user.age=20; from User user where user.age between 20 and 30; from User user where user.agein(20,30); from User user where user.name is null; from User user where user.name like‘%zx%’; from User user where(user.age%2)=1; from User user where user.age=20 and user.name like‘%zx%’; </pre> ===實(shí)體的更新和刪除=== *利用HQL進(jìn)行實(shí)體更新和刪除的技術(shù)。 *這項(xiàng)技術(shù)功能是Hibernate3的新加入的功能,在Hibernate2中是不具備的。 *比如在Hibernate2中,如果我們想將[[數(shù)據(jù)庫(kù)]]中所有18歲的用戶的年齡全部改為20歲,那么要首先將年齡在18歲的用戶檢索出來(lái),然后將他們的年齡修改為20歲,最后調(diào)用Session.update()語(yǔ)句進(jìn)行更新。在Hibernate3中對(duì)這個(gè)問(wèn)題提供了更加靈活和更具效率的解決辦法,如下面的代碼: <pre> Transaction trans=session.beginTransaction(); String hql=”update User user set user.age=20 where user.age=18”; Query queryupdate=session.createQuery(hql); intret=queryupdate.executeUpdate(); trans.commit(); </pre> *通過(guò)這種方式可以在Hibernate3中,一次性完成批量數(shù)據(jù)的更新,對(duì)性能的提高是相當(dāng)?shù)目捎^。同樣也可以通過(guò)類似的方式來(lái)完成delete操作,如下面的代碼: <pre> Transaction trans=session.beginTransaction(); Stringhql=”delete from User user where user.age=18”; Queryqueryupdate=session.createQuery(hql); intret=queryupdate.executeUpdate(); trans.commit(); </pre> *這種操作方式在Hibernate3中稱為bulkdelete/update,這種方式能夠在很大程度上提高操作的靈活性和運(yùn)行效率,但是采用這種方式極有可能引起[[緩存]]同步上的問(wèn)題。 ===屬性查詢=== *很多時(shí)候在檢索數(shù)據(jù)時(shí),并不需要獲得實(shí)體對(duì)象所對(duì)應(yīng)的全部數(shù)據(jù),而只需要檢索實(shí)體對(duì)象的部分屬性所對(duì)應(yīng)的數(shù)據(jù)。這時(shí)候就可以利用HQL屬性查詢技術(shù),如下面[[程序]]示例: <pre> List list=session.createQuery(“selectuser.namefromUseruser”).list(); for(int i=0;i<list.size();i ){ System.out.println(list.get(i)); } </pre> *只檢索了User實(shí)體的name屬性對(duì)應(yīng)的數(shù)據(jù),此時(shí)返回的包含結(jié)果集的list中每個(gè)條目都是String類型的name屬性對(duì)應(yīng)的數(shù)據(jù)。我們也可以一次檢索多個(gè)屬性,如下面程序: <pre> List list=session.createQuery(“select user.name,user.age from User user ”).list(); for(int i=0;i Object[] obj=(Object[])list.get(i); System.out.println(obj[0]); System.out.println(obj[1]); } </pre> *此時(shí)返回的結(jié)果集list中,所包含的每個(gè)條目都是一個(gè)Object[]類型,其中包含對(duì)應(yīng)的屬性數(shù)據(jù)值??赡軙?huì)覺(jué)得上面返回Object[]不夠符合面向?qū)ο箫L(fēng)格,可以利用HQL提供的動(dòng)態(tài)構(gòu)造實(shí)例的功能對(duì)這些平面數(shù)據(jù)進(jìn)行封裝,如下面的程序代碼: <pre> Listlist=session.createQuery(“selectnewUser(user.name,user.age)fromUseruser”).list(); for(inti=0;i Useruser=(User)list.get(i); System.out.println(user.getName()); System.out.println(user.getAge()); } </pre> 通過(guò)動(dòng)態(tài)構(gòu)造實(shí)例對(duì)象,對(duì)返回結(jié)果進(jìn)行了封裝,使程序更加符合面向?qū)ο箫L(fēng)格,但是這里有一個(gè)問(wèn)題必須注意,那就是這時(shí)所返回的User對(duì)象,僅僅只是一個(gè)普通的Java對(duì)象而以,除了查詢結(jié)果值之外,其它的屬性值都為null(包括主鍵值id),也就是說(shuō)不能通過(guò)[[Session]][對(duì)象]]對(duì)此對(duì)象執(zhí)行持久化的更新操作。如下面的代碼: <pre> Listlist=session.createQuery(“selectnewUser(user.name,user.age)fromUseruser”).list(); for(inti=0;i Useruser=(User)list.get(i); user.setName(“gam”); session.saveOrUpdate(user); //這里將會(huì)實(shí)際執(zhí)行一個(gè)save操作, //而不會(huì)執(zhí)行update操作,因?yàn)檫@個(gè)User對(duì)象的id屬性為null, //Hibernate會(huì)把它作為一個(gè)自由對(duì)象 //(請(qǐng)參考持久化對(duì)象狀態(tài)部分的論述), //因此會(huì)對(duì)它執(zhí)行save操作。 } </pre> ===分組與排序=== *Orderby子句: 與SQL語(yǔ)句相似,HQL查詢也可以通過(guò)orderby子句對(duì)查詢結(jié)果集進(jìn)行排序,并且可以通過(guò)[[asc]]或者[[desc]]關(guān)鍵字指定排序方式,如下面的代碼: <pre>fromUseruserorderbyuser.nameasc,user.agedesc;</pre> 上面HQL查詢語(yǔ)句,會(huì)以name屬性進(jìn)行升序排序,以age屬性進(jìn)行降序排序,而且與SQL語(yǔ)句一樣,默認(rèn)的排序方式為asc,即升序排序。 *Groupby子句與統(tǒng)計(jì)查詢: 在HQL語(yǔ)句中同樣支持使用groupby子句分組查詢,還支持groupby子句結(jié)合聚集函數(shù)的分組統(tǒng)計(jì)查詢,大部分標(biāo)準(zhǔn)的SQL聚集函數(shù)都可以在HQL語(yǔ)句中使用,比如:count(),sum(),max(),min(),avg()等。如下面的程序代碼: <pre> Stringhql=”selectcount(user),user.agefromUserusergroupbyuser.agehavingcount(user)>10”; Listlist=session.createQuery(hql).list(); </pre> *優(yōu)化統(tǒng)計(jì)查詢: 假設(shè)現(xiàn)在有兩張數(shù)據(jù)庫(kù)表,分別是customer表和order表,它們的結(jié)構(gòu)如下: <pre> customer IDvarchar2(14) agenumber(10) namevarchar2(20) </pre> <pre> order IDvarchar2(14) order_numbernumber(10) customer_IDvarchar2(14) </pre> 現(xiàn)在有兩條HQL查詢語(yǔ)句,分別如下: <pre> fromCustomercinnerjoinc.ordersogroupbyc.age;(1) selectc.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID fromCustomercinnerjoinc.orderscgroupbyc.age;(2) </pre> 這兩條語(yǔ)句使用了HQL語(yǔ)句的內(nèi)連接查詢,現(xiàn)在可以看出這兩條查詢語(yǔ)句最后所返回的結(jié)果是一樣的,但是它們其實(shí)是有明顯區(qū)別的 語(yǔ)句(1)檢索的結(jié)果會(huì)返回Customer與Order持久化對(duì)象,而且它們會(huì)被置于Hibernate的Session緩存之中,并且Session會(huì)負(fù)責(zé)它們?cè)诰彺嬷械奈ㄒ恍砸约芭c后臺(tái)數(shù)據(jù)庫(kù)數(shù)據(jù)的同步,只有事務(wù)提交后它們才會(huì)從緩存中被清除; 而語(yǔ)句(2)返回的是關(guān)系數(shù)據(jù)而并非是持久化對(duì)象,因此它們不會(huì)占用Hibernate的Session緩存,只要在檢索之后應(yīng)用程序不在訪問(wèn)它們,它們所占用的[[內(nèi)存]]就有可能被[[JVM]]的垃圾回收器回收,而且Hibernate不會(huì)同步對(duì)它們的修改。 ===參數(shù)綁定=== Hibernate中對(duì)動(dòng)態(tài)查詢參數(shù)綁定提供了豐富的支持,那么什么是查詢參數(shù)動(dòng)態(tài)綁定呢?其實(shí)如果我們熟悉傳統(tǒng)[[JDBC]]編程的話,我們就不難理解查詢參數(shù)動(dòng)態(tài)綁定,如下代碼傳統(tǒng)JDBC的參數(shù)綁定: <pre> PrepareStatementpre=connection.prepare(“select*fromUserwhereuser.name=?”); pre.setString(1,”zhaoxin”); ResultSetrs=pre.executeQuery(); </pre> 在Hibernate中也提供了類似這種的查詢參數(shù)綁定功能,而且在Hibernate中對(duì)這個(gè)功能還提供了比傳統(tǒng)JDBC操作豐富的多的特性,在Hibernate中共存在4種參數(shù)綁定的方式,下面我們將分別介紹: *按參數(shù)名稱綁定: 在HQL語(yǔ)句中定義命名參數(shù)要用”:”開(kāi)頭,形式如下: <pre> Queryquery=session.createQuery(“fromUseruserwhereuser.name=:customernameanduser:customerage=:age”); query.setString(“customername”,name); query.setInteger(“customerage”,age); </pre> 上面代碼中用:customername和:customerage分別定義了命名參數(shù)customername和customerage,然后用Query接口的setXXX()方法設(shè)定名參數(shù)值,setXXX()方法包含兩個(gè)參數(shù),分別是命名參數(shù)名稱和命名參數(shù)實(shí)際值。 *按參數(shù)位置邦定: 在HQL查詢語(yǔ)句中用”?”來(lái)定義參數(shù)位置,形式如下: <pre> Queryquery=session.createQuery(“fromUseruserwhereuser.name=?anduser.age=?”); query.setString(0,name); query.setInteger(1,age); </pre> 同樣使用setXXX()方法設(shè)定綁定參數(shù),只不過(guò)這時(shí)setXXX()方法的第一個(gè)參數(shù)代表邦定參數(shù)在HQL語(yǔ)句中出現(xiàn)的位置編號(hào)(由0開(kāi)始編號(hào)),第二個(gè)參數(shù)仍然代表參數(shù)實(shí)際值。 *setParameter()方法: 在Hibernate的HQL查詢中可以通過(guò)setParameter()方法邦定任意類型的參數(shù),如下代碼: <pre> Stringhql=”fromUseruserwhereuser.name=:customername”; Queryquery=session.createQuery(hql); query.setParameter(“customername”,name,Hibernate.STRING); </pre> 如上面代碼所示,setParameter()方法包含三個(gè)參數(shù),分別是命名參數(shù)名稱,命名參數(shù)實(shí)際值,以及命名參數(shù)映射類型。對(duì)于某些參數(shù)類型setParameter()方法可以更具參數(shù)值的Java類型,猜測(cè)出對(duì)應(yīng)的[[映射]]類型,因此這時(shí)不需要顯示寫出映射類型,像上面的例子,可以直接這樣寫: query.setParameter(“customername”,name);但是對(duì)于一些類型就必須寫明映射類型,比如java.util.Date類型,因?yàn)樗鼤?huì)對(duì)應(yīng)Hibernate的多種映射類型,比如Hibernate.DATA或者Hibernate.TIMESTAMP。 *setProperties()方法: 在Hibernate中可以使用setProperties()方法,將命名參數(shù)與一個(gè)對(duì)象的屬性值綁定在一起,如下程序代碼: <pre> Customercustomer=newCustomer(); customer.setName(“pansl”); customer.setAge(80); Queryquery=session.createQuery(“fromCustomercwherec.name=:nameandc.age=:age”); query.setProperties(customer); </pre> setProperties()方法會(huì)自動(dòng)將customer對(duì)象實(shí)例的屬性值匹配到命名參數(shù)上,但是要求命名參數(shù)名稱必須要與實(shí)體對(duì)象相應(yīng)的屬性同名。 還有一個(gè)特殊的setEntity()方法,它會(huì)把命名參數(shù)與一個(gè)持久化對(duì)象相關(guān)聯(lián),如下面代碼所示: <pre> Customercustomer=(Customer)session.load(Customer.class,”1”); Queryquery=session.createQuery(“fromOrderorderwhereorder.customer=:customer”); query.setProperties(“customer”,customer); Listlist=query.list(); </pre> 上面的代碼會(huì)生成類似如下的SQL語(yǔ)句: Select*fromorderwherecustomer_ID=’1’; *使用綁定參數(shù)的優(yōu)勢(shì): ①、可以利用數(shù)據(jù)庫(kù)實(shí)施性能優(yōu)化,因?yàn)閷?duì)Hibernate來(lái)說(shuō)在底層使用的是PrepareStatement來(lái)完成查詢,因此對(duì)于語(yǔ)法相同參數(shù)不同的SQL語(yǔ)句,可以充分利用預(yù)編譯SQL語(yǔ)句緩存,從而提升查詢效率。 ②、可以防止SQLInjection安全漏洞的產(chǎn)生 == 相關(guān)條目 == *[[SQL]] *[[SQL SERVER]] *[[Hibernet]] *[[JAVA]] == 參考來(lái)源 == *http://blog.csdn.net/rigger21/archive/2007/08/09/1733821.aspx *http://www.hudong.com/wiki/hql [[category:數(shù)據(jù)庫(kù)|H]] [[category:java|H]] [[category:Hibernate|H]]
摘要:
請(qǐng)注意,您對(duì)站長(zhǎng)百科的所有貢獻(xiàn)都可能被其他貢獻(xiàn)者編輯,修改或刪除。如果您不希望您的文字被任意修改和再散布,請(qǐng)不要提交。
您同時(shí)也要向我們保證您所提交的內(nèi)容是您自己所作,或得自一個(gè)不受版權(quán)保護(hù)或相似自由的來(lái)源(參閱
Wordpress-mediawiki:版權(quán)
的細(xì)節(jié))。
未經(jīng)許可,請(qǐng)勿提交受版權(quán)保護(hù)的作品!
取消
編輯幫助
(在新窗口中打開(kāi))
取自“
http://www.kktzf.com.cn/wiki/HQL
”