HibernateCriteria實現(xiàn)SQL語句定制_第1頁
HibernateCriteria實現(xiàn)SQL語句定制_第2頁
HibernateCriteria實現(xiàn)SQL語句定制_第3頁
HibernateCriteria實現(xiàn)SQL語句定制_第4頁
HibernateCriteria實現(xiàn)SQL語句定制_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、hibernate criteria對象詳解1. 序言hibernate框架是目前javaee軟件開發(fā)的企業(yè)主流框架, 學(xué)習hibernate必然要掌握orm(對象關(guān)系映射object/relation mapping)的概念思想, hibernate擁有完全的orm理念,我們在操作數(shù)據(jù)庫時,可以通過面向?qū)ο蟮姆绞骄涂梢酝瓿蓴?shù)據(jù)庫的crud(創(chuàng)建(create)、更新(update)、讀?。╮ead)和刪除(delete)操作。企業(yè)在使用hibernate進行軟件開發(fā)進行數(shù)據(jù)查詢時,主要基于 hql(hibernate 面向?qū)ο蟮牟樵冋Z言, 語法類似sql )、 criteria (面向?qū)ο蟮?/p>

2、條件查詢對象)、 sql (原生態(tài)sql語句) 幾種方式, 本文重點講解criteria 這種完全面向?qū)ο缶幊滩樵兎绞剑?詳細分析crieria 各種使用與sql生成關(guān)系。2. criteria牛刀小試 criteria 是一個完全面向?qū)ο?,可擴展的條件查詢api ,通過它完全不需要考慮數(shù)據(jù)庫底層如何實現(xiàn)、sql語句如何編寫, 是hibernate框架的核心查詢對象。hibernate 定義了criteriaspecification接口規(guī)范用來完成面向?qū)ο蟮臈l件查詢,criteria 就是criteriaspecification的子接口。2.1. 創(chuàng)建數(shù)據(jù)庫環(huán)境 我們以 部門(depart

3、ment)和員工(employee) 案例,來講解criteria的詳細使用 部門表 department 使用mysql5.x數(shù)據(jù)庫 數(shù)據(jù)庫 hibernate3 用戶名 root 密碼 abc 部門表 employee create table department ( id int(11) not null auto_increment, name varchar(255) default null, primary key (id) engine=innodb default charset=utf8;員工表 department create table employee (id i

4、nt(11) not null auto_increment,name varchar(255) default null, age int(11) not null, birthday date default null, department_id int(11) default null, primary key (id), foreign key (department_id) references department (id) engine=innodb default charset=utf8; 2.2. 使用jpa注解配置實體類部門類 department員工類 employe

5、e2.3. 使用crteria查詢所有部門和所有員工2.3.1. 查詢所有部門產(chǎn)生的sql語句 2.3.2. 查詢所有員工產(chǎn)生的sql語句當session.createcriteria(實體類.class) 就會產(chǎn)生一條 select 所有列 from 表; sql語句, 查詢實體類對應(yīng)數(shù)據(jù)表的所有記錄, 然后我們就可以在這個criteria對象上進行條件查詢、分頁查詢、多表關(guān)聯(lián)查詢、投影查詢、子查詢 等一系列操作 . 3. criteria sql定制詳解3.1. 對查詢添加條件對象criterionorg.hibernate.criterion.criterion是hibernate提供的

6、一個面向?qū)ο蟛樵儣l件接口,一個單獨的查詢就是criterion接口的一個實例, 用于限制criteria對象的查詢, 在hibernate中criterion對象的創(chuàng)建通常是通過restrictions 工廠類完成的。restrictions 提供條件查詢方法 例如: 1、 查詢姓”張”的所有員工信息 產(chǎn)生的sql 語句 2、 查詢年齡大于24的所有員工 產(chǎn)生的sql語句 3、 查詢年齡小于28的 姓“王”的員工產(chǎn)生的sql語句 對于多個查詢條件, restrictions 提供了邏輯組合查詢方法and(criterion lhs, criterion rhs) 用于生成多個條件and關(guān)系sq

7、l語句 or(criterion lhs, criterion rhs) 用于生成多個條件or關(guān)系sql語句not(criterion expression) 用于查詢與條件相反的數(shù)據(jù),生成not取反查詢語句3.2. 分頁操作 firstresult和maxresults criteria 接口提供 用于分頁查詢的方法,實現(xiàn)數(shù)據(jù)庫sql物理級別的分頁操作 setfirstresult(int firstresult) 設(shè)置記錄的其實位置 0 代表第一條記錄 setmaxresults(int maxresults) 設(shè)置查詢記錄的長度 例如: 我要查詢 1-10條件記錄 firstresult

8、為0 , maxresult為10 產(chǎn)生的sql語句3.3. 排序操作 order hibernate 提供org.hibernate.criterion.order 用于排序操作 , criteria 接口提供addorder(order order)用于生成排序sql 例如: 查詢所有員工信息,按照年齡升序排列產(chǎn)生的sql語句 3.4. 多表關(guān)聯(lián)操作 createalias和createcriteria criteria接口提供createalias 和 createcriteria 兩組方法用于完成多表關(guān)聯(lián)查詢 createalias(string associationpath, st

9、ring alias) 采用內(nèi)連接關(guān)聯(lián)createalias(string associationpath, string alias, int jointype) 可以通過jointype 指定連接類型 createcriteria(string associationpath) 采用內(nèi)連接關(guān)聯(lián) (返回新的criteria對象)createcriteria(string associationpath, int jointype) 可以通過jointype指定關(guān)聯(lián)類型 (返回新的criteria對象 ) 例如: 查詢部門為“人力資源部”的所有員工 方法一: 使用createcriteria

10、方法 產(chǎn)生的sql語句代碼中的 criteria對象,是針對employee表, criteria.createcriteria(”department”) 就是建立employee表和department表的內(nèi)連接。 返回的是 針對department表新的criteria2對象, 這時再對criteria2 添加條件, 就是查詢department部門表的屬性,而不是employee的屬性了。 方法二: 使用createalias 方法 使用createalias 方法不會像 createcriteria 那樣返回一個新的criteria對象,alias只是對關(guān)聯(lián)表進行別名設(shè)置,通過別名引

11、用設(shè)置屬性 產(chǎn)生的sql語句 3.5. 投影、分組查詢 projection 在實際開發(fā)中,進行查詢是, 可能只需要返回表中的指定列信息(投影) 或者進行統(tǒng)計查詢 (count、avg、sum、min、max), criteria接口提供setprojection(projection projection) 方法用于實現(xiàn)投影查詢操作。 org.hibernate.criterion.projections 工廠類用于返回projection投影查詢對象 例如: 1. 查詢員工表的name和age屬性產(chǎn)生的sql語句pperty(屬性名) 也可以寫為 propert

12、y.forname(屬性名 )2查詢員工的總數(shù)量 projections 提供了分組函數(shù)的查詢方法 rowcount() 查詢記錄總數(shù)量count(string propertyname) 統(tǒng)計某列數(shù)量countdistinct(string propertyname) 統(tǒng)計某列數(shù)量(排除重復(fù))avg(string propertyname) 統(tǒng)計某列平均值 sum(string propertyname) 對某列值求和 max(string propertyname) 求某列最大值 min(string propertyname) 求某列最小值 產(chǎn)生的sql語句 3查詢每個部門的員工數(shù)量 (

13、輸出部門的編號和數(shù)量 )projections提供groupproperty(string propertyname) 用于執(zhí)行分組操作產(chǎn)生的sql語句3.6. 設(shè)置結(jié)果集封裝策略 resulttransformer 剛剛說了投影操作的使用, 其實在hibernate 內(nèi)部投影查詢是會影響到結(jié)果集的封裝策略的。 先用hql舉例說明 :session.createquery(”from employee”).list(); 返回 list<employee> session.createquery(”select count(e) from employee e”).list();

14、返回list<long>session.createquery(”select name,age from employee”).list(); 返回list<object> 從這幾個例子我們不難發(fā)現(xiàn),如果沒有指定select語句(沒有投影) ,那么將返回表中的所有字段,返回結(jié)果會被封裝到entity實體對象employee中,一但提供select語句(投影)后,返回的結(jié)果類型,將不再封裝到employee對象,而是根據(jù)投影的實際類型返回, 這就是投影對結(jié)果封裝策略的影響。 我們再來看之前寫過的criteria 查詢案例 :session.createcriteria(

15、employee.class).list(); 返回 list<employee> session.createcriteria(employee.class).setprojection(pjectionlist().add(property.forname(”name”).add(property.forname(”age”); 返回 list<object> 投影之后, 返回的結(jié)果將不再被封裝到employee對象中,這是為什么呢? 我們一起來看看 criteria的接口定義,不難發(fā)現(xiàn)在criteria接口中提供了一個setresulttransformer(resulttransformer resulttransformer),這個resulttransformer就是結(jié)果集轉(zhuǎn)換策略接口, 在criteria的父接口中criteriaspecification定義了幾個resulttransformer的常用實現(xiàn) alias_to_entity_map 將結(jié)果集封裝到map對象 root_entity 將結(jié)果集封裝到根實體對象distinct_root_entity 將結(jié)果集封裝到不重復(fù)的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論