本章介紹Hibernate的幾種主要檢索方法:HQL檢索法、QBC檢索法和SQL檢索法。HQL是Hibernate查詢語言的縮寫,是官方推薦的查詢語言。QBC是Query By Criteria的縮寫,是Hibernate提供的查詢接口。Hibernate是壹個輕量級框架,允許您使用原始SQL語句查詢數據庫。
1.1 HQL基金會
HQL是Hiberante推薦的官方Hibernate檢索方法。它使用類似SQL的查詢語言,以面向對象的方式從數據庫中查詢。您可以使用HQL查詢具有繼承、多態和關聯的數據。檢索數據時,應優先考慮HQL模式。
1.1.1默認數據庫表和數據
在解釋本章時,除非特別說明,所有使用的數據庫都是joblog,即第四章建立的數據庫。Joblog增加了三個表:學生表、課程表和選課表sc。
學生表中每個字段的結構如圖6-1所示,字段的中文意思在註釋欄。
圖6-1學生表的數據結構
學生表中的數據如圖6-2所示。除非另有規定,否則將使用所有六個記錄。
這裏仍然使用第四章建立的HibernateProject項目,但是在這裏創建了壹個新的包hibernate.ch06,它存儲了本章的所有代碼。在hibernate.ch06包中建立壹個對應student表的持久類Student.java,代碼如下。
圖6-2學生表中的數據
包hibernate.ch06
//學生類
公共課學生{
私有整數id;//對象標識符
私有整數sno//學生編號
私有字符串sname//名稱
私有字符串ssex//性別
私有字符串sdept//部門
私有整數sage//年齡
私有字符串saddress//籍貫
.....//省略了所有get/set訪問器。
}
課程course中各字段的結構如圖6-3所示,字段的中文含義在註釋欄。
圖6-3課程表的結構
課程表中的數據如圖6-4所示。除非另有規定,否則使用所有四個記錄。
圖6-4課程表數據
在hibernate.ch06中新建壹個持久類Course.java類,代碼如下。
包hibernate.ch06
//課程類
公開課程{
私有整數id;//對象標識符
私有整數cno//課程編號
私有字符串cname//課程名稱
私有整數Ccredit//學分
.....//省略get/set訪問器。
}
選修表sc(sc是student-course的縮寫)的結構如圖6-5所示,字段的中文含義在註釋欄。
圖6-5選修列表的結構
選修表中的數據如圖6-6所示。除非另有規定,否則使用這五個記錄。
圖6-6選修表數據
在hibernate.ch06中新建壹個持久類SC.java,SC.java的代碼如下。
包hibernate.ch06
//選修課
公共類SC實現java.io.Serializable {
私有整數id;// id
私有整數sno//學生編號
私有整數cno//課程編號
私有整數等級;//結果
公共SC() {
}
.....//省略get/set訪問器。
}
這三個表和三個持久性類將在後面的章節中用到。
1.1.2檢索該類的所有對象。
使用HQL語句可以檢索壹個類的所有對象。例如,HQL語句“from Student”意味著檢索Student類的所有對象。下面的程序檢索student類的所有對象。
query query = session . create query(" from Student ");//創建查詢對象
list list = query . list();//執行查詢
//下面的代碼是展示用的,以後不寫了。
叠代器it = list . iterator();
while (it.hasNext()) {
學生stu =(學生)it . next();
system . out . println(" id "+stu . getid());
system . out . println(" name "+stu . getsname());
system . out . println(" \ n ");
}
Session.createQuery()將HQL查詢語句作為參數來生成查詢對象。在本例中,HQL語句是“from Student”,它是壹個from子句,格式如下。
從類名
其中,類名可以是類的全限定名,如:
來自hibernate.ch06.Student
Hibernate使用自動導入功能,會自動找到需要的類,所以不建議使用類的全限定名。註意,類名是區分大小寫的。如果它是由student編寫的,將引發以下異常。
Java . lang . noclassdeffounderror:hibernate/ch06/student(錯誤名稱:hibernate/ch06/Student)
HQL關鍵字不區分大小寫,From、from和FROM是相同的。
當妳調用查詢時。List(),您真正開始執行HQL查詢語句並將查詢結果放入列表中。
在這個例子中,查詢了Student類中的所有屬性。如果要查詢學生類中的壹個或幾個屬性,比如所有學生的姓名和院系,就需要使用屬性查詢。
1.1.3檢索類的壹些性質
與SQL語句類似,HQL語句可以檢索壹個類的壹個或多個屬性。下面的代碼查詢所有學生的姓名和院系。
//創建查詢對象
query query = session . create query(" select Student . sname,Student . sdept from Student ");
list list = query . list();//執行查詢
//下面的代碼顯示查詢的信息。
叠代器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 ");
}
屬性查詢使用select關鍵字,屬性查詢的格式如下。
從類名中選擇屬性1,屬性2,…
屬性可以通過在它前面添加類名來限定,例如:
從類名中選擇屬性1,屬性2,…
但壹般沒必要。
如果用上面的代碼編寫,屬性查詢是區分大小寫的:
選擇名稱,從學生中提取
將引發異常,指示找不到屬性SNAME和Sdept。
查詢結果將只顯示查詢的屬性列。
屬性查詢的結果可以針對it.next()獲取的每條記錄存儲在Object[]數組中,方便訪問。
1.1.4請指定別名。
查詢時,可以使用關鍵字as來指定查詢的別名,這樣可以簡化查詢,有時必須指定別名才能查詢。以下代碼查詢學號包含4的學生的姓名和系。
select s.sname,s . sdept from Student as s where s . SnO like ' % 4% ' from Student s
s是該班學生的別名。註意as可以省略,即下面的查詢語句與上面的語句等價。
select s.sname,s . s dept from Student s where s . SnO like ' % 4% ' from Student s
1.1.5 where條件子句
where condition子句類似於SQL中的where condition子句,後者檢索滿足條件的對象。例如,查詢計算機科學系的所有學生:
Select s.sname,s.sdept from students,其中s.dept =' computer '
where子句指定查詢的條件,其語法類似於SQL。
比較運算符可以在where子句中指定: >、& gt= 、& lt、& lt= 、& lt& gt其含義有大於、大於等於、小於、小於等於、不等於。
查詢22到23歲的學生:
來自學生s的where s.sage & gt=22和聖賢& lt=23
在where子句中指定查詢的屬性是否為空:為空和不為空,分別表示為空和不為空。
查詢籍貫為空的學生:
來自學生s,其中s.saddress為空
1.1.6使用distinct過濾掉重復值。
使用distinct關鍵字將刪除結果中的重復值,並且只檢索滿足條件的對象。如下例所示,在student實例中檢索不重復的年齡。
session session = HSF . current session();//創建會話
string hql = " select distinct s . sage from Student s ";//HQL查詢語句
query query = session . create query(hql);//創建查詢
list list = query . list();//執行查詢
搜索的結果如下。可以看出,從結果中刪除了壹個重復的22歲。
20
21
22
23
24