hibernate 中HQL語句查詢學習


本章介紹了Hibernate的幾種主要檢索方式:HQL檢索方式、QBC檢索方式、SQL檢索方式。HQL是Hibernate  Query Language的縮寫,是官方推薦的查詢語言。QBC是Query By  Criteria的縮寫,是Hibernate提供的一個查詢接口。Hibernate是一個輕量級的框架,它允許使用原始SQL語句查詢數據庫。

6.1 HQL基礎

HQL是Hiberante官方推薦的Hibernate檢索方式,它使用類似SQL的查詢語言,以面向對象的方式從數據庫中查詢。可以使用HQL查詢具有繼承、多態和關聯關系的數據。在檢索數據時應優先考慮使用HQL方式。

6.1.1 默認數據庫表和數據

在講解本章時,在沒有特殊說明時,用到的數據庫均為joblog,也就是在第4章建立的數據庫。joblog中添加了3個表:學生表student、課程表course和選課表sc。

學生表student中各字段的結構如圖6-1所示,字段的中文含義在Comment列中。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客

圖6-1 學生表的數據結構

學生表student中的數據如圖6-2所示,沒有特殊說明時,用到的均為這6條記錄。

此處仍然使用在第4章建立的HibernateProject項目,但是這里新建了一個包hibernate.ch06,這個包存放本章中的所有代碼。在hibernate.ch06包中建立學生表對應的持久化類Student.java,代碼如下。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客

圖6-2 學生表中的數據

package hibernate.ch06;

//學生類

public class Student {

       private Integer id;             //對象標識符

      private Integer sno;            //學號

      private String sname;          //姓名

      private String ssex;            //性別

      private String sdept;           //所在系別

      private Integer sage;           //年齡

      private String saddress;       //籍貫

     …… //省略了所有的get/set訪問器

}

課程表course中的各個字段的結構如圖6-3所示,字段的中文含義在Comment列中。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客

圖6-3 課程表的結構

課程表中的數據如圖6-4所示,如果沒有特殊說明,用到的均為這4條記錄。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客

圖6-4 課程表的數據

在hibernate.ch06中新建持久化類Course.java類,代碼如下。

package hibernate.ch06;

//課程類

public class Course {

       private Integer id;             //對象標識符

     private Integer cno;            //課程號

       private String cname;           //課程名

       private Integer Ccredit;       //學分

 

       …… //省略了get/set訪問器

}

選修表sc(sc為student-course的縮寫)的結構如圖6-5所示,字段的中文含義在Comment列中。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客

圖6-5 選修表的結構

選修表中的數據如圖6-6所示,沒有特殊說明時,用到的均為這5條記錄。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客

圖6-6 選修表的數據

在hibernate.ch06中新建持久化類SC.java,SC.java的代碼如下。

package hibernate.ch06;

//選課類

public class SC implements java.io.Serializable  {

       private Integer id;             //id

       private Integer sno;           //學號

       private Integer cno;           //課程號

       private Integer grade;         //成績

     public SC() {

       }

      …… //省略get/set訪問器

}

后面的章節中將用這3個表和3個持久化類進行講解。

6.1.2 檢索類的所有對象

使用HQL語句可以檢索出一個類的所有對象,如HQL語句“from  Student”表示檢索Student類的所有對象。下面的程序檢索學生類的所有對象。

        Query query=session.createQuery("from  Student"); //創建Query對象

        List  list=query.list();                                                   //執行查詢

 

        //以下代碼做顯示用,以后不再寫出來

        Iterator it=list.iterator();

        while(it.hasNext()){

                Student stu=(Student)it.next();

                 System.out.println("id"+stu.getId());

                 System.out.println("name"+stu.getSname());

                System.out.println("/n");

        }

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客     session.createQuery()以HQL查詢語句為參數,生成一個查詢對象。本例中的HQL語句為“from  Student”,這是from子句,格式如下。

from 類名

其中,類名可以為類的全限定名,如:

from hibernate.ch06.Student

Hibernate使用自動引入功能(auto  import),會自動尋找需要的類,所以不推薦使用類的全限定名。注意,類名區分大小寫,如果寫成from student,將會拋出以下異常。

java.lang.NoClassDefFoundError:  hibernate/ch06/student (wrong name: hibernate/ch06/Student)

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客      HQL關鍵字不區分大小寫,FROM、from和From是一樣的。

調用query.list()時,真正開始執行HQL查詢語句,並把查詢的結果放在List中。

本例中查詢的是Student類中的所有屬性,如果查詢Student類中的某一個或某幾個屬性,如查詢所有學生的姓名和所在系,需要用到屬性查詢。

6.1.3 檢索類的某幾個屬性

與SQL語句類似,HQL語句可以檢索類的某一個或者某幾個屬性。以下代碼查詢所有學生的姓名和所在系。

        //創建Query對象

        Query  query=session.createQuery("select Student.sname,Student.sdept from  Student");

        List list=query.list();     

//執行查詢

        //以下代碼顯示查詢的信息

        Iterator it=list.iterator();

        while(it.hasNext()){

                Object[]  stu=(Object[])it.next();

                System.out.println("id"+stu[0]);

                 System.out.println("name"+stu[1]);

                System.out.println("/n");

        }

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客    屬性查詢使用select關鍵字,屬性查詢的格式如下。

select 屬性1,屬性2,… from 類名

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客     屬性前可以加上類名加以限定,如:

select 屬性1,屬性2,… from 類名

但一般沒有必要。

屬性查詢區分大小寫,上面的代碼中如果寫成:

select SNAME,Sdept from Student

將拋出異常,提示找不到屬性SNAME和屬性Sdept。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客     查詢結果將只顯示查詢的屬性列。

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客   屬性查詢的結果,對於用it.next()獲得的每條記錄,可以存儲在Object[]數組中,以便進行存取

6.1.4 指定別名

在查詢時,可以用關鍵字as指定查詢的別名,指定別名可以簡化查詢,有時必需指定別名才能進行查詢。以下代碼查詢學號中含有4的學生的姓名和所在系。

select s.sname,s.sdept from Student as s where s.sno like '%4%'from Student s

s就是類Student的別名。注意as可以省略,即下面的查詢語句和上面的語句是等效的。

select s.sname,s.sdept from Student s where s.sno  like '%4%'from Student s

6.1.5  where條件子句

where條件子句跟SQL中的where條件子句類似,它檢索符合條件的對象。例如,查詢所有所在系別為計算機系的學生:

select s.sname,s.sdept from Student s where  s.dept=’計算機’

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客     where子句指定查詢的條件,其語法和SQL類似

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客     在where子句中可以指定比較運算符:>、>=、<、<=、<>,其含義分別為大於、大於等於、小於、小於等於、不等於。

查詢年齡在22到23歲的學生:

from Student s where s.sage>=22 and  s.sage<=23

hibernate 中HQL語句查詢學習 - 魚兒 - 魚兒的博客     在where子句中指定查詢的屬性是否為null:is null、is not null,其含義分別表示為空和不為空

查詢所在籍貫為空的學生:

from Student s where s.saddress is null

6.1.6 使用distinct過濾掉重復值

使用distinct關鍵字將去掉結果中的重復值,只檢索符合條件的對象。如下面的例子檢索學生實例中的不重復的年齡。

        Session  session=HibernateSessionFactory.currentSession();            //創建Session

        String hql="select distinct s.sage from  Student s";                   //HQL查詢語句

        Query  query=session.createQuery(hql);                                    //創建查詢

        List  list=query.list();                                                    //執行查詢

檢索的結果如下,可見結果中去掉了一個重復的22歲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM