Hibernate學習-Hibernate查詢語言HQL

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 . 新建數據庫,完成相關表的創建,而後而且建立外鍵,本次案例的外鍵爲:

image

【附:數據庫相關表】

image

image

2. 在MyEclipse中選擇MyEclipse Database Explorer,與當前數據庫創建連接

image(因爲個人數據庫已經創建了,因此我只把信息的截圖列出來)

 

3.在項目中建立Hibernate

 

QQ截圖20150606144612QQ截圖20150606144643QQ截圖20150606144722QQ截圖20150606144746

 

4.在MyEclipse Database Explorer建立映射

 

QQ截圖20150606144838QQ截圖20150606144903QQ截圖20150606144929

 

5.修改相關xml文件

 

QQ截圖20150606145036

注:刪除掉系統創建的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());
            
        }
        
    }
}

結果:

image

 

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());
            }
        }
        
    }
}

  結果:

image

 

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

相關文章
相關標籤/搜索