hibernate多表查詢HQL

2022-09-11 06:09:09 字數 2754 閱讀 2104

innerjoin(內連線)

left outerjoin(左外連線)

right outerjoin(右外連線)

fulljoin(全連線,並不常用)

sql中的條件用on即:leftjoin...on...

hql中的條件用with即:leftjoin... with...

語句innerjoin, left outerjoin以及 right outerjoin可以簡寫。

fromcatascatjoincat.mateasmate    leftjoincat.kittensaskitten

通過hql的with關鍵字,你可以提供額外的join條件。

fromcatascat     leftjoincat.kittensaskitten         with kitten.bodyweight > 10.0

還有,乙個"fetch"連線允許僅僅使用乙個選擇語句就將相關聯的物件或一組值的集合隨著他們的父物件的初始化而被初始化,這種方法在使用到集合的情況下尤其有用,對於關聯和集合來說,它有效的代替了對映檔案中的外聯接 與延遲宣告(lazy declarations).

fromcatascat     innerjoinfetch cat.mate    leftjoinfetch cat.kittens

乙個fetch連線通常不需要被指定別名, 因為相關聯的物件不應當被用在where子句 (或其它任何子句)中。同時,相關聯的物件 並不在查詢的結果中直接返回,但可以通過他們的父物件來訪問到他們。

fromcatascat     innerjoinfetch cat.mate    leftjoinfetch cat.kittens child    leftjoinfetch child.kittens

假若使用iterate()來呼叫查詢,請注意fetch構造是不能使用的(scroll() 可以使用)。fetch也不應該與setmaxresults() 或setfirstresult()共用,這是因為這些操作是基於結果集的,而在預先抓取集合類時可能包含重複的資料,也就是說無法預先知道精確的行數。fetch還不能與獨立的 with條件一起使用。通過在一次查詢中fetch多個集合,可以製造出笛卡爾積,因此請多加注意。對bag對映來說,同時joinfetch多個集合角色可能在某些情況下給出並非預期的結果,也請小心。最後注意,使用fulljoinfetch 與 rightjoinfetch是沒有意義的。

如果你使用屬性級別的延遲獲取(lazy fetching)(這是通過重新編寫位元組碼實現的),可以使用 fetch all properties 來強制hibernate立即取得那些原本需要延遲載入的屬性(在第乙個查詢中)。

fromdocument fetch all properties orderbyname

fromdocument doc fetch all propertieswherelower(doc.name) like''%cats%''

hibernate多表查詢

在沒有使用select的時候,返回的是乙個 student物件,否則返回的是乙個物件陣列 object ilist userlist session.find from testmssql.student as student where student.name 張三 nhibernate.nhi...

Hibernate之多表查詢

原生sql多表查詢 1.交叉連線 笛卡爾積 select from a,b 2.內連線 1 隱式內連線 select from a,b where b.aid a.id 2 顯示內連線 select from a inner join b on b.aid a.id 3.外鏈結 1 左外連線 sel...

Hibernate多表查詢結果處理

如果我們在hibernate中需要查詢多個表的不同字段,那麼如何來獲取hibernate多表查詢的結果呢?有兩種方式 1 對各個字段分別轉化成對應型別,如下 query q session.createquery select members,classinfo.classname from mem...