敘:上一章節輕風記錄的是HQL的單表查詢,本章節就HQL的多表查詢方式進行記錄;
HQL查詢數據
本章節主要學習的是HQL查詢方式的表查詢;
幾種查詢方式
1. 內連查詢
查詢語句比較奇怪,from Customer c inner join c.linkMens,查詢Customer類所映射的表和Customer類中linkMens屬性所代表的實體類的映射的數據庫表;這句話很拗口,但是多讀兩遍理解理解就好了,重點理解的是linkMens是Customer類中的屬性,linkMens是LinkMan實體類在Customer類中的對象屬性,因此,在內連查詢中也可以理解為,查詢兩張表中的數據,對一個類進行操作,但是這個類中必須含有另一個表的映射類的對象屬性才行。具體的代碼如下所示:
查詢代碼:
@Test // HQL的內連接 public void demo1() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String hql = " from Customer c inner join c.linkMens "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] arr : list) { System.out.println(Arrays.toString(arr)); } bt.commit(); session.close(); }
要知道的是,既然是多表查詢的內連查詢,那么就應該考慮到之前學過的關聯映射的知識,內連查詢就是指查詢類A中的一條數據a所關聯的類B中的所有數據,因此可以視為(就是)“一對多”關系,因此,在類A的實體類中要有關聯類B的對象集合;
在Customer類中的代碼:
運行Demo后的結果:
從查詢代碼和查詢結果中看得出,查詢獲得的數據是集合數組,因為內連查詢獲得的是以鍵值對的形式顯示出來的,“鍵”是Customer類所映射的表中的數據,“值”是linkMens所代表的實體類所映射的數據表的數據;因此需要使用Object[]的范型進行約束;
2. 迫切查詢
迫切查詢,主要有兩點和內連查詢不同,第一點是,在查詢語句中添加一個關鍵字,第二點是,由於查詢語句變化導致的,導致查詢到的結果顯示形式不同,內連查詢獲得的數據是鍵值對的形式,而迫切查詢獲得的是合並后的數據形式,將兩條數據合為一條新的並以主查詢實體類的數據形式返回;
查詢代碼如下:
@Test // HQL迫切查詢 public void demo2() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String hql = " from Customer c inner join fetch c.linkMens "; Query query = session.createQuery(hql); List<Customer> list = query.list(); System.out.println(list); bt.commit(); session.close(); }
添加的關鍵字:fetch
這個例子中主查詢類是Customer,所以其返回值的范型是Customer,運行的結果如下圖所示:
從中可以看出,數據變成了一條一條的被放在以一個數據集合中;
3. 左外連接查詢
首先左連接的特點是查詢出來的結果,左邊不能為空,右邊可以為空,右連接與此相反;
在進行demo代碼編寫時先在兩個表中分別加入一條沒有關聯的數據,既是LinkMan表中加入一條lkm_cust_id列為空的數據,在Customer表中加入一條只有cust_name數據的數據;
下邊是demo的編寫,和內連接只多一個關鍵字left;
@Test // HQL的左連接查詢 public void demo3() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String hql = " from Customer c left join c.linkMens "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] arr : list) { System.out.println(Arrays.toString(arr)); } bt.commit(); session.close(); }
查詢到的結果如下:

4. 右外連接查詢
和左外連接查詢基本一樣,只不過關鍵字和查詢可為空、不可為空的像顛倒了;
代碼:
@Test // HQL的右連接查詢 public void demo4() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String hql = " from Customer c right join c.linkMens "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] arr : list) { System.out.println(Arrays.toString(arr)); } bt.commit(); session.close(); }
查詢到的結果如下:

pass:一般情況下多表查詢不會用HQL來進行,因為語法比較拗口(拗腦子),如果多表查詢的話查詢的表太多了就會導致語法混亂不易修改維護等;
pass~pass:下一章節記錄QBC數據查詢方式~
