HQL(Hibernate Query Language)Hibernate查詢語言,語法類似於SQL,可以直接使用實體類及屬性。
使用HQL 可以避免使用JDBC 查詢的一些弊端
不需要再編寫繁復的SQL 語句,針對實體類及其屬性進行查詢
查詢結果是直接存放在List 中的對象,不需要再次封裝
獨立於數據庫,對不同的數據庫根據Hibernate dialect 屬性的配置自動生成不同的SQL 語句執行
一、語法:
select/update/delete……] from Entity [where……] [group by……] [having……] [order by……]
其中:藍色標記的部分為必須書寫的
二、基礎查詢
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
三、返回類型
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實體類的。
四、使用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