物件之間總是有各種各樣的關係,關聯關係是類之間最常見的關係。多表查詢是hql中的強大功能之一,包括內連線、左連線和右連線等。
在資料庫中用到了3個表:student(學生表)、course(課程表)和sc(選課表)。在現實模型中,乙個學生可以選擇多門課程,乙個課程可以被多個學生選擇,student和course是多對多的關聯關係。
在多對多的關聯關係中,一般來說有個中間表,這個表描述了多對多關係,這就是選課表sc,sc每一行資料代表乙個學生的選課和成績。
各個表的主鍵、外來鍵設定如下。
student表的主鍵是id欄位。
course表的主鍵是id欄位。
sc表的主鍵是id欄位。
sc表中的sno欄位是student表id欄位的外來鍵。
sc表中的cno欄位是course表id欄位的外來鍵。
對映檔案:
說明如下:
元素是和元素平行的元素。元素表明將要對映的字段對應著乙個集合。元素包含多個屬性,其中:name屬性用於設定對映的持久化類的屬性名稱,在本例中為student表的course屬性;table屬性表示多對多關聯關係的中間表名稱,此處為sc表;cascade表示當儲存或者更新student例項時,是否儲存或更新course物件。
元素的子元素設定與student表關聯的中間表sc的外來鍵sno。
元素的子元素用於設定多對多關係。在該元素中,class屬性用於設定多對多關係中,與student類關聯的類course類;column屬性設定中間表與course表連線的外來鍵cno。
1、左外連線
左外連線(left outer join)查詢出左表對應的復合條件的所有記錄,如查詢李曉梅同學的選課資訊。
string hql="from student s left join s.course c where s.sname='李曉梅'";
如果只用單錶查詢,只能從student表中查詢出李曉梅的個人資訊,而無法知道她的選課資訊,因為選課資訊儲存在中間表sc中。hql語句from student s left join s.course c where s.sname='李曉梅'檢索出了李曉梅的選課資訊。
在hql中使用left outer join關鍵字進行左外連線,outer關鍵字可以省略。
s.course是student物件中的乙個屬性,用來儲存student物件的選課資訊。在執行查詢時,將根據student.hbm.xml中的配置生成sql語句,並檢索資訊。
查詢的結果返回乙個object陣列,陣列的第0個元素是student物件,第1個元素是與object[0]中對應的學生所選課的course物件。
2、左外抓取連線
左外抓取連線指定在hibernate檢索資料時,採用抓取的方式,直接將資料載入到與student物件關聯的course屬性中。下面是左外抓取連線的程式。
string hql="select s from student s left join fetch s.course c where s.sname='李曉梅'";
左外抓取連線使用left join fetch關鍵字。
與左外連線不同的是:左外抓取連線query.list()返回的集合中存放student物件的引用,與之相關聯的選課資訊存放在course屬性中。
3、右外連線
hql中使用關鍵字right outer join右外連線,outer關鍵字可以省略。右外連線與左外連線類似,不再贅述。
4、 內連線
內連線(inner join)是指兩個表中指定的關鍵字相等的值才會出現在結果集中的一種查詢方式。hql中使用關鍵字inner join進行內連線,下面是使用內連線的程式。
string hql="from student s inner join s.course c";
hql中使用inner join進行內連線,內連線只關聯並檢索那些選了課的學生資訊及其選課資訊,沒有選課的學生不在檢索結果中。
可以使用select s from student s inner join s.course c只返回student物件。
5、 抓取內連線
抓取內連線與內連線不同之處在於其物件的記憶體狀態不一樣。hql中使用inner join fetch進行抓取內連線。
string hql="select s from student s inner join fetch s.course c";
hql 多表連線查詢
到網了找了n久的資料,沒看到乙個滿意的答案 還是自己發點時間研究了一下。原碼如下 統計 return throws busines ceptions public list statistic integer type,string productid,string clientid,date da...
hibernate多表查詢HQL
innerjoin 內連線 left outerjoin 左外連線 right outerjoin 右外連線 fulljoin 全連線,並不常用 sql中的條件用on即 leftjoin.on.hql中的條件用with即 leftjoin.with.語句innerjoin,left outerjoi...
十 Hibernate查詢之HQL多表查詢
關於hql語句介紹使用可以檢視這裡,今天主要介紹其在多表系對映中的應用。常用的sql語句多表查詢有以下幾種 以customers 和orders 表為例 外連線查詢 多表的查詢中,hql語句和sql語句的查詢語法比較類似,hql不用書寫select 和on及後面的條件表示式,同時表名變成類名書寫,其...