熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

hibernate連接查詢總結

2013-11-23 20:09:32  來源: Java開源技術 

  假使現在有兩張關聯表customer和order一般情況下是一個customer可以對應多個order而一個order只能對應一個customer那麼order中會有個customer對象作為屬性hbm中會有個manytoone而customer中會有一個set<Order>hbm中會有一個onetomay

  下面我們研究下在各種連接方式下的查詢的策略及結果並對其歸納總結

  第一無連接

  hqlfrom Customer cwhere cname like T%

  說明以上語句未顯示指定其關聯的order

  執行的sqlselect * from customer  wherename like T%

  查詢結果為

  Id

  Name

  Age

  

  Tom

  

  

  Tom

  

  結果結果中包含兩個customer的對象元素他們分別對應id是的兩條數據他們的order集合屬性均未被初始化

  第二迫切左外連接

  hqlfrom Customer c leftjoin fetch corder where cname like T%

  說明顯示指定查詢某人對應的order屬性

  執行的sqlselect cC_ID cNAME oID oORDER_NUMBER oCUSTOMER_ID

  From CUSTOMER c left out join ORDER o oncID=oCUSTOMER_ID  where (cNAME like T%)

  查詢結果為

  C_ID

  NAME

  AGE

  O_ID

  O_NUMBER

  CUSToMER_ID

  

  tom

  

  

  Tom_order

  

  

  tom

  

  

  Tom_order

  

  

  tom

  

  

  Tom_order

  

  

  tom

  

  null

  null

  null

  結果以左表為基礎查詢所有T開頭的用戶的對應的order當用戶無訂單時其order屬性用null填充

  (注hibernate允許一條查詢迫切左外連接到多個多對一或者一對一的關聯表比如A表中有一個字段bId一個字段cId而分別存在一個B表和C表兩者的id分別是A的屬性那麼他們在進行迫切左外連接時語句為from A a left join fetch ab b left join fetch ac c where b is notnull and c is not null或者第二種情況為A中有bIdB中有cIdC表不與其他表關聯那麼他們的語句為from A a left join fetch ab b left join fetch bc where b is notnull and c is not null)

  第三左外連接

  hql: from Customer c left join corderwhere cname like T%

  說明顯示指定查詢某人對應的order屬性

  執行的sqlselect cID C_ID cNAME cAGE oID O_ID oORDER_NUMBERoCUSTOMER_ID  from CUSTOMER c left outer join ORDERS  o on cID=oCUSTOMER_ID where (cNAME like T%)

  查詢結果為

  C_ID

  NAME

  AGE

  O_ID

  ORDER_NUMER

  CUSTOMER_ID

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  null

  null

  null

  第四內連接

  hql: from Customer c inner join corders owhere cname likeT%

  執行的sql語句select cID C_ID cNAMEcAGE oID O_ID oORDER_NUMBERoCUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on cID=oCUSTOMER_ID   where (cNAME like T%)

  查詢結果為

  C_ID

  NAME

  AGE

  O_ID

  ORDER_NUMBER

  CUSTOMER_ID

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  第五迫切內鏈接

  hqlfrom Customer cinner join fetch corders o where cname like T%

  執行的sqlselect cID C_ID cNAMEcAGE oID O_ID oORDER_NUMBERoCUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on cID=oCUSTOMER_ID   where (cNAME like T%)

  查詢結果為

  C_ID

  NAME

  AGE

  O_ID

  ORDER_NUMBER

  CUSTOMER_ID

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  第六右外鏈接

  Hqlfrom Customer c rightjoin fetch corders o where cname like T%

  執行的sqlselect cID C_ID cNAMEcAGE oID O_ID oORDER_NUMBERoCUSTOMER_IDfrom CUSTOMER c right outer join ORDERS o on cID=oCUSTOMER_ID   where (cNAME like T%)

  查詢結果為

  C_ID

  NAME

  AGE

  O_ID

  ORDER_NUMBER

  CUSTOMER_ID

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  

  Tom

  

  

  Tom_order

  

  總結則為下表所示

  連接方式

  對應的sql查詢

  Orders集合的檢索策略

  查詢結果的內容

  無連接

  查詢單個customer表

  延遲檢索策略

  集合包含customer的元素集合中無重復元素customer對應的order對象沒有被初始化

  迫切左外連接

  左外連接查詢customer和order

  迫切左外連接檢索策略

  集合中包含customer的元素集合中可能有重讀元素customer對象的order集合屬性被初始化

  左外連接

  左外連接查詢customer和order

  延遲檢索策略

  集合中包含對象數據類型的元素每個對象數組包含一對customer對象和order對象不同的對象數組可能重復引用同一個customer對象了customer對象的order集合屬性未被初始化

  內連接

  內連接查詢customer表和order表

  延遲檢索策略

  集合中包含對象數據類型的元素每個對象數組包含一對customer對象和order對象不同的對象數組可能重復引用同一個customer對象了customer對象的order集合屬性未被初始化

  迫切內連接

  內連接查詢customer和order

  迫切內鏈接檢索策略

  集合中包含customer類型的元素集合中可能有重復元素customer對象的order集合屬性被初始化

  右外鏈接

  右外鏈接查詢customer表和order

  延遲檢索策略

  集合中包含對象數組類型的元素每個對象包含一對customer和order不同的對象數組可能引用同一個customer對象customer對象的order集合屬性未被初始化


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28043.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.