hibernate進行多表查詢與sql其實是很相似的,但是hql會在原來sql分類的基礎上又多出來一些操作。
hql的多表連線查詢的分類如下:
其實這些連線查詢語法大致都是一致的,都是hql查詢的是物件而sql查詢的是表。那麼我們來比較一下sql和hql的連線查詢。
sql連線查詢:
hql連線查詢:
在hql中,我們不用寫關聯欄位了,因為客戶中的聯絡人的集合其實對應的就是外來鍵,所以我們在inner join的後面直接可以寫c.linkmans。在控制台輸出的語句的格式如下:
我們發現如果這樣寫hql語句的話,生成的底層的sql語句就是使用inner join進行連線,而連線的條件就是 customer_.cust_id=linkmans1_lkm_cust_id。就是兩個表的關聯的字段。所以hql的連線不用寫具體的on條件。直接寫關聯的屬性即可。那麼我們已經知道了hql的內連線的具體的寫法了,那麼迫切內連線和內連線寫法和使用上有什麼區別呢?迫切內連線其實就是在內連線的inner join後新增乙個fetch關鍵字。我們來比對一下:
內連線:
控制台輸出效果如下:
迫切內連線:
控制台輸出效果如下:
我們會發現無論是內連線或是迫切內連線傳送的底層sql都是一樣的,而且在生成的sql語句中也沒有fetch關鍵字,當然fecth本身就不是sql語句的關鍵字。所以一定要注意,fetch只能在hql中使用,生成了sql語句以後,fetch就消失了。那麼fetch到底有什麼作用呢?
其實我們知道hql內連線查詢的和sql內連線查詢到的結果集都是一樣的,都是兩個表的交集部分的資料。
然後在封裝資料的時候,普通內連線會將屬於客戶的資料封裝到customer物件中,會將屬於聯絡人的資料封裝到linkman物件中,所以每條記錄都會是裝有兩個物件的集合,所以封裝以後的資料是list,在object中有兩個物件,乙個是customer,另乙個是linkman。所以在使用普通內連線的時候可以如下編寫**:
那麼加了fetch以後,雖然我們查詢到的資料是一樣的,但是hibernate發現hql中有fetch就會將資料封裝到乙個物件中,吧屬於客戶的資料封裝到customer物件中,將屬於聯絡人的部分封裝到customer中的聯絡人的集合中,這樣最後封裝完成以後是乙個list中。所以使用迫切內連線的時候可以如下編寫**:
其實內連線和迫切內連線的主要區別就在於封裝資料,因為他們查詢的結果集都是一樣的,生成底層的sql語句也是一樣的。
內連線:傳送就是內連線的語句,封裝的時候將屬於各自物件的資料封裝到各自的物件中,最後得到list.
迫切內連線:傳送的是內連線的語句,需要在編寫hql的時候在join後新增乙個fetch關鍵字,hibernate會傳送hql中的fecth關鍵字,從而將每條資料封裝到物件中,最後得到乙個list.
但是迫切內連線封裝以後會出現重複的資料,因為我們查詢到目前有三條記錄,就會被封裝到三個物件中,其實我們真正的客戶物件只有兩個,所以往往自己在手動編寫迫切內連線的時候使用distinct去掉重複值。
hql 多表連線查詢
到網了找了n久的資料,沒看到乙個滿意的答案 還是自己發點時間研究了一下。原碼如下 統計 return throws busines ceptions public list statistic integer type,string productid,string clientid,date da...
php連線hive執行HQL查詢
使用php連線hive的條件 1 需要安裝thrift 安裝步驟 configure without ruby make make install 如果沒有安裝libevent libevent devel的應該先安裝這兩個依賴庫yum y install libevent libevent dev...
HQL多表查詢
物件之間總是有各種各樣的關係,關聯關係是類之間最常見的關係。多表查詢是hql中的強大功能之一,包括內連線 左連線和右連線等。在資料庫中用到了3個表 student 學生表 course 課程表 和sc 選課表 在現實模型中,乙個學生可以選擇多門課程,乙個課程可以被多個學生選擇,student和cou...