程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> hibernate連接查詢總結

hibernate連接查詢總結

編輯:關於JSP

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

 

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

 
第一,無連接
hql:from Customer cwhere c.name like “T%”

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

執行的sql:select * from customer  wherename like “T%”

查詢結果為:

Id
 Name
 Age
 
1
 Tom
 21
 
5
 Tom
 25
 

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

 

第二,迫切左外連接
hql:from Customer c leftjoin fetch c.order where c.name like “T%”

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

執行的sql:select c.C_ID, c.NAME , o.ID , o.ORDER_NUMBER, o.CUSTOMER_ID

From CUSTOMER c left out join ORDER o onc.ID=o.CUSTOMER_ID  where (c.NAME like “T%”)

查詢結果為:

C_ID
 NAME
 AGE
 O_ID
 O_NUMBER
 CUSToMER_ID
 
1
 tom
 21
 1
 Tom_order001
 1
 
1
 tom
 21
 2
 Tom_order002
 1
 
1
 tom
 21
 3
 Tom_order003
 1
 
5
 tom
 25
 null
 null
 null
 

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

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

 

第三,左外連接
hql: from Customer c left join c.orderwhere c.name like “T%”

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

執行的sql:select c.ID C_ID, c.NAME , c.AGE, o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_ID  from CUSTOMER c left outer join ORDERS  o on c.ID=o.CUSTOMER_ID where (c.NAME like ‘T%’)

查詢結果為:

C_ID
 NAME
 AGE
 O_ID
 ORDER_NUMER
 CUSTOMER_ID
 
1
 Tom
 21
 1
 Tom_order001
 1
 
1
 Tom
 21
 2
 Tom_order002
 1
 
1
 Tom
 21
 3
 Tom_order003
 1
 
5
 Tom
 25
 null
 null
 null
 

 

 

第四,內連接
hql: from Customer c inner join c.orders owhere c.name like”T%”

執行的sql語句:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID   where (c.NAME like ‘T%’)

查詢結果為:

C_ID
 NAME
 AGE
 O_ID
 ORDER_NUMBER
 CUSTOMER_ID
 
1
 Tom
 21
 1
 Tom_order001
 1
 
1
 Tom
 21
 2
 Tom_order002
 1
 
1
 Tom
 21
 3
 Tom_order003
 1
 

 

 

第五,迫切內鏈接
hql:from Customer cinner join fetch c.orders o where c.name like ‘T%’

執行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c inner join ORDERS o on c.ID=o.CUSTOMER_ID   where (c.NAME like ‘T%’)

查詢結果為:

C_ID
 NAME
 AGE
 O_ID
 ORDER_NUMBER
 CUSTOMER_ID
 
1
 Tom
 21
 1
 Tom_order001
 1
 
1
 Tom
 21
 2
 Tom_order002
 1
 
1
 Tom
 21
 3
 Tom_order003
 1
 

 

 

第六,右外鏈接
 

Hql:from Customer c rightjoin fetch c.orders o where c.name like ‘T%’

執行的sql:select c.ID C_ID ,c.NAME,c.AGE , o.ID O_ID , o.ORDER_NUMBER,o.CUSTOMER_IDfrom CUSTOMER c right outer join ORDERS o on c.ID=o.CUSTOMER_ID   where (c.NAME like ‘T%’)

查詢結果為:

C_ID
 NAME
 AGE
 O_ID
 ORDER_NUMBER
 CUSTOMER_ID
 
1
 Tom
 21
 1
 Tom_order001
 1
 
1
 Tom
 21
 2
 Tom_order002
 1
 
1
 Tom
 21
 3
 Tom_order003
 1
 

 

 

 

 總結則為下表所示:

連接方式
 對應的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集合屬性未被初始化。
 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved