摘要:本文探討了Hibernate查詢的五種方法:HQL查詢,本地SQL查詢,命名查詢,對(duì)象化查,動(dòng)態(tài)分離查詢。
關(guān)鍵詞:HQL查詢;本地SQL查詢;命名查詢;對(duì)象化查詢;動(dòng)態(tài)分離查詢
中圖分類號(hào):TP312.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2012) 20-0000-02
Hibernate是一個(gè)開源的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,完成數(shù)據(jù)持久化的重任。本文舉例探討了Hibernate查詢的五種方法:
1 HQL查詢(Hibernate Query Language)
1.1 HQL是Hibernate查詢語(yǔ)言,是一種面向?qū)ο蟮牟樵冋Z(yǔ)言,操作的對(duì)象是類、實(shí)例、屬性等,是一種select…from的語(yǔ)法結(jié)構(gòu),from后跟的是實(shí)體類名,而不是表名。
示例1:
Query query=session.creatQuery(\"from User\");
List list= query.list();
查詢返回的類型可以為:Object[]數(shù)組、List類型、Map類型、Java實(shí)體對(duì)象。
示例2:
Query query=session.creatQuery(\"select u.name ,u.telephone from User u where name=:name\"); //使用命名參數(shù)查詢
query.setString(\"name\", name);
List
HQL提供一種面向?qū)ο蟮牟樵冋Z(yǔ)言,其語(yǔ)法更接近傳統(tǒng)的SQL語(yǔ)句的查詢語(yǔ)法。使用HQL能夠避免使用JDBC查詢的一些弊端:首先,不需要再編寫繁瑣的SQL語(yǔ)句,將針對(duì)實(shí)體類及其屬性進(jìn)行查詢,其次,查詢結(jié)果是直接存放在List中的對(duì)象,不需要再次封裝。而且HQL獨(dú)立于數(shù)據(jù)庫(kù)。
2 本地SQL查詢
HQL查詢功能雖然強(qiáng)大,但是HQL不能涵蓋所有的查詢特性,有時(shí)不得不借助SQL達(dá)到期望的目標(biāo)。HQL對(duì)本地SQL查詢提供了內(nèi)置的支持,稱為本地SQL查詢:
示例3:
Query query = session.createSQLQuery(\"select * from t_user\").addEntity(User.class);
List rs = query.list();
\"select * from t_user\"為SQL語(yǔ)句,from后為表名。此方法的缺點(diǎn)是破壞跨平臺(tái),不面向?qū)ο蟆?/p>
3 命名查詢
Hibernate中可以命名常用的查詢,需要使用的是只需要引用名稱就可以了,命名查詢一般配置在實(shí)體類中。
3.1 XML配置命名查詢
示例4:
<![CDATA[from User where id=:id]] >
Query query = session.getNamedQuery(\"getUserById\");
query.setInteger(\"id\", id);
List list = query.list();
這種方法以松耦合的方式來(lái)配置查詢語(yǔ)句,從而可以更好地提高程序解耦。
3.2 @配置命名查詢
使用@注解配置實(shí)體類時(shí),要使用@注解配置命名查詢,用到的Java注解為@NamedQuery與@NamedNativeQuery。
示例5:
@NamedQuery(name=\"all User\" ,query=\"from User\")//命名查詢
@NamedNativeQuery(name=\"all User\",query=\"select * from tab_user\")//命名本地查詢
@Entity
@Table(name=\"tab_user\")
Public class User{
}
Query query=sesssion.getNamedQuery(\"all User\")
4 對(duì)象化查詢Criteria方法:
4.1 Criteria查詢采用面向?qū)ο蟮姆绞椒庋b查詢條件,對(duì)SQL語(yǔ)句進(jìn)行封裝,采用對(duì)象的方式來(lái)組合各種查詢條件,由Hibernate自動(dòng)產(chǎn)生SQL查詢語(yǔ)句。
示例6:
Criteria criteria=Session.createCriteria(User.class);
criteria.add(Restrictions.eq(\"name\",name));
criteria.add(Restrictions.eq(\"pwd\", pwd));
List
使用Criteria查詢需要首先創(chuàng)建criteria對(duì)象,傳入的參數(shù)是對(duì)應(yīng)的實(shí)體類的類型對(duì)象。
4.2 Example查詢
在使用criteria查詢時(shí),設(shè)定查詢條件并非一定要使用Restrictions,如果屬性條件很多,使用Restrictions也不方便。如果已經(jīng)有了一個(gè)對(duì)象,那就可以根據(jù)這個(gè)對(duì)象作為查詢的條件,查詢出屬性與之類似的對(duì)象。
示例7:
User user = new user();
User.setAge(20);
List
5 動(dòng)態(tài)分離查詢DetachedCriteria
以上所有查詢都必須是在session保持連接的情況下進(jìn)行的,有時(shí)查詢需要將組織查詢條件與執(zhí)行查詢分開來(lái)進(jìn)行,這時(shí)在創(chuàng)建查詢條件的時(shí)候就不能使用Criteria類了,而須使用DetachedCriteria類;
示例8:
a.先創(chuàng)建一個(gè)離線查詢條件對(duì)象
DetachedCriteria dc = DetachedCriteria.forClass(User.class); //加入查詢條件
dc.add(Restrictions.ge(\"age\",new Integer(25)));
b.將創(chuàng)建的離線查詢對(duì)象當(dāng)成參數(shù)傳遞給session來(lái)創(chuàng)建一個(gè)Criteria 對(duì)象,然后執(zhí)行查詢
Session session = HibernateSessionFactory.getSession();//綁定Session并返回一個(gè)Criteria實(shí)例
Criteria criteria = dc.getExecutableCriteria(session);
List userList = criteria.list();
通過(guò)這種方法可以實(shí)現(xiàn)查詢條件對(duì)象與執(zhí)行查詢分別在兩個(gè)不同類中進(jìn)行;當(dāng)然b最常見應(yīng)該是在一個(gè)類的方法中。
6 結(jié)束語(yǔ)
通過(guò)以上示例探討了Hibernate查詢的五種方法,方便Java程序員靈活的運(yùn)用這些方法,操縱數(shù)據(jù)庫(kù),完成數(shù)據(jù)持久化的任務(wù)。
參考文獻(xiàn):
[1]夏昕,曹曉剛,唐勇.深入淺出Hibernate [M].北京:電子工業(yè)出版社,2005.
[2]Christian Bauer、Gavin King. Hibernate 實(shí)戰(zhàn) [M].北京:人民郵電出版社,2008.
[作者簡(jiǎn)介]
王英瑛(1978-),女,講師,碩士,主研方向:信息與計(jì)算科學(xué)。
基金項(xiàng)目:山東工商學(xué)院 校青年基金資助項(xiàng)目(2011QN063)。