當前位置:成語大全網 - 漢語詞典 - 查詢調用有道詞典。

查詢調用有道詞典。

Hibernate中的HQL語句

本章介紹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