HQL(Hibernate Query Language)Hibernate查詢語言,語法相似於SQL,能夠直接使用實體類及屬性。java
使用HQL 能夠避免使用JDBC 查詢的一些弊端web
不須要再編寫繁複的SQL 語句,針對實體類及其屬性進行查詢數據庫
查詢結果是直接存放在List 中的對象,不須要再次封裝數組
獨立於數據庫,對不一樣的數據庫根據Hibernate dialect 屬性的配置自動生成不一樣的SQL 語句執行session
1、語法:函數
select/update/delete……] from Entity [where……] [group by……] [having……] [order by……]測試
其中:藍色標記的部分爲必須書寫的spa
2、基礎查詢hibernate
1) HQL語法相似於SQL,有SQL的關鍵詞select、from、order by、count()、where等。設計
2) 不一樣的是HQL是一種徹底面向對象的語言,可以直接查詢實體類及屬性
3)HQL語法相似於SQL,是一種select ... from結構。其中,from後跟的是實體類名,而不是表名。select後面跟的能夠是實體對象,也能夠是實體對象的屬性或者其餘的值。如:
Query query = session.createQuery("select c from Cat as c"); //查詢全部的Cat List<Cat> catList = query.list(); //執行查詢,返回List其中Cat爲實體類Cat,c爲Cat對象,關鍵詞as用法同SQL,能夠省略。Query是Hibernate的查詢對象,query.list()將以List類型返回查詢結果,上面代碼也能夠簡寫爲:
Query query = session.createQuery("from Cat"); //查詢全部的Cat List<Cat> catList = query.list(); //執行查詢,返回List
3、返回類型
Hiberante使用Query對象進行查詢。Session的createQuery()方法可以建立Query實例,參數爲HQL。Query對象可以返回各類類型的查詢結構,例如:long、、String、List<實體類>、List<Map>、POJO等。
【下述爲類型】
3.1 返回類型--查詢單個對象
Query的unique()返回單個對象。使用unique()獲取返回值時,HQL語句查詢到的結果最多隻能有一個,若是結果多於一個,unique()方法會拋出異常。若是沒有,會返回null。這個方法經常用來查詢記錄總數,由於總會返回一個對象,而且也只有一個。
如:
Query q =session.createQuery("select count(c) from Cat c"); //建立查詢對象 Number num = (Number)q.uniqueResult(); //返回單個實例 int count = num.inValue(); //返回數值
3.2 返回類型--返回集合屬性
Query的list()方法是最經常使用的方法。實際上,unique()方法也是在list()方法獲得返回數據後執行的。list()老是返回一個java.util.List對象,裏面有0個或多個值。list()能夠返回實體對象,也能夠返回實體對象的某個屬性或某些屬性。
如:
List<Cat> catList = session.createQuery("select c from Cat c").list(); //返回存儲Cat對象的List List<String> nameList = session.createQuery("select c.name from Cat c").list(); //返回存儲貓名字(String類型)的List List<String[]> nameList=session.createQuery("select c.name, c.mother.name from Cat c").list(); //返回貓名字、貓媽媽名字的字符串數組(String[]類型)的List List<Cat> motherList = session.createQuery("select c.mother from Cat c"); //返回貓媽媽的List,雖然是Cat的一個屬性,但仍然是Cat類型
3.3 同時返回多個對象
Query的list()方法返回java.util.List對象。List中通常存儲完整的實體類對象。如select c from Cat c,會將全部的Cat都查詢出來,包含Cat類全部即時加載的屬性。
對於有些查詢,只須要查幾個屬性就能夠了,這時候能夠在HQL中指定要返回的部分。查詢部分屬性時,返回結果仍然是List類型,裏面多是單個的Object,也多是Object[]數組,還多是List對象或Map對象。返回什麼類型數據,由HQL語句決定。
3.4 同時返回多個對象--返回Object[]數組
查詢多個屬性時,Hibernate將同時返回多個對象(以Object[]對象類型返回)。返回的數組是放到List<Object[]>中的,獲得返回數組須要遍歷List對象。
如:
List<Object[]> list = session.createQuery("select c.name,c.mother.name, c.createDate from Cat c").list(); //返回list for(Object[] row:list){ //遍歷第1層的list for(Object obj:row){ //遍歷第2層的數組 System.out.println(""+obj); //輸出Object } }
3.5 同時返回多個對象--返回List類型
返回結果還能夠放到List<List>中。查詢時HQL採用「select new List(a,b,c) from ...」的形式。一樣須要遍歷List來獲取返回的List,再遍歷返回的List獲取查詢結果。
如:
List<List> list = session.createQuery("select new List( c.name,c.mother, c.createDate) from Cat c").list(); //關鍵詞List for(List row:list){ //遍歷第1層的list for(Object obj:row){ //遍歷第2層的數組 System.out.println(""+obj); //輸出Object } }
3.6 同時返回多個對象-- 返回Map類型
更實用的是返回Map類型。Map中將包含查詢的列名、值。遍歷List<Map>得到Map,從Map中直接取值就能夠了,或者遍歷Map。
如:
List listMap = session.createQuery("select new Map( c.name as name,c.mother as mother, c.createDate as createDate) from Cat c").list(); //關鍵詞List for(Map map:(List<Map>)listMap)){ //遍歷第1層的list System.out.println("name:"+map.get("name")); System.out.println("Mother:"+map.get("mother")); System.out.println("CreateDate:"+map.get("createDate")); }
3.7 同時返回多個對象--返回Java實體對象
對於只查詢部分屬性的查詢,返回數組、List、Map時,很方便,可是操做Object[]數組、List、Map等不如操做實體對象方便。實際上查詢部分屬性時,也能夠返回實體對象。HQL中也可使用構造函數。
如:
List<Cat> catList=session.createQuery("select new Cat(cat.name, cat.createDate) from Cat c").list();
這樣使用時,Cat類必須存在 一個public Cat(String name, Date createDate)的構造函數。由於Hibernate是經過該構造函數完成返回值從Object[]數組轉化到Cat實體類的。
4、使用MyEclipse建立使用Hibernate應用
1 . 新建數據庫,完成相關表的創建,而後而且建立外鍵,本次案例的外鍵爲:
【附:數據庫相關表】
2. 在MyEclipse中選擇MyEclipse Database Explorer,與當前數據庫創建連接
3.在項目中建立Hibernate
4.在MyEclipse Database Explorer建立映射
5.修改相關xml文件
注:刪除掉系統創建的TbCat.hbm.xml和TbCatMother.hbm.xml中的catlog,是爲了讓系統數據庫管理數據庫信息,而不是讓代碼管理數據庫信息
6.建立測試類
6.1 查詢寵物表中的信息
package cn.edu.bzu.test; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import cn.edu.bzu.dao.HibernateSessionFactory; import cn.edu.bzu.entity.TbCat; public class test { public static void main(String args[]){ Session session=HibernateSessionFactory.getSession(); //經過HibernateSessionFactory獲得session對象 Query q=session.createQuery("from TbCat"); //建立查詢 List<TbCat> list=q.list(); //獲得查詢的值,查詢的值爲一個List集合 for(TbCat cat:list){ //進行數據遍歷 System.out.println("Name: "+cat.getName()+",Description: "+cat.getDescription()+"CreateDate: "+cat.getCreateDate()); } } }
結果:
6.2 查詢寵物的媽媽以及其孩子的信息
package cn.edu.bzu.test; import java.util.List; import java.util.Set; import org.hibernate.Query; import org.hibernate.Session; import cn.edu.bzu.dao.HibernateSessionFactory; import cn.edu.bzu.entity.TbCat; import cn.edu.bzu.entity.TbCatMother; public class TestMother { public static void main(String args[]){ Session session=HibernateSessionFactory.getSession(); Query q=session.createQuery("from TbCatMother"); List<TbCatMother> list=q.list(); //取得全部母親的信息 for(TbCatMother mother:list){ System.out.println("The Mother is " +mother.getName()); System.out.println("---------------"); System.out.println(mother.getName()+"'s Child are "); Set myset=mother.getTbCats(); //返回一個set對象 Object[] array_cat=myset.toArray(); //將set對象轉換爲數組的形式 for(int i=0;i<array_cat.length;i++){ TbCat tbCat=(TbCat) array_cat[i]; //取得一行的cat數據 System.out.println("Name: "+tbCat.getName()+" Description: "+tbCat.getDescription()); } } } }
結果:
7.總結
7.1 建立數據庫,創建相關表
7.2 建立web project ,而且在MyEclipse Database Explorer 中創建相關數據庫鏈接
7.3 添加Hibernate,完成相關設計
7.4 在MyEclipse Database Explorer中爲相關的表創建映射關係,並修改相關表的xml文件中的屬性,本案例修改的catlog屬性
7.5 創建相關測試類,測試數據查詢等操做
8.相關資料下載
8.1 Hibernate查詢語言HQL