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