假使現在有兩張關聯表,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集合屬性未被初始化。