Hibernate的檢索方式

無意間看到的一篇文章,是有關hibernate的檢索方式的
感覺很有用處,
下面是鏈接:
[url]http://aumy2008.blogbus.com/logs/13835265.html[/url]
雖然還是有點不大懂,但是以後我會在此基礎上進行一些稍微的補充的


關於setFetchMode:
FetchMode是讓兩個表建立連接,僅此而已。
例如:一個Emp只能屬於一個dept,而一個dept中可以有好多Emp,
這時在Emp中就有一個dept對象
public class Emp{

.......
private dept d;
get()方法
set()方法
......
}
那麼如果我想取出emp的時候順便把它的dept相關的東西給取出來,此時我就需要setFetchMode("dept",FetchMode.JOIN),這樣,我就可以正好把相關的dept裏面的數據也取出來了,如果打印數據庫執行語句,此時是生成的左連接,
但是注意:setFetchMode:僅僅能取出dept的數據,setFetchMode不能完成查詢功能。如果查詢條件裏面有dept裏面的東西,那setFetchMode就完不成相應的查詢,如果想完成查詢,你就需要用createAlias了

關於CreateAlias:
主要是用於查詢的時候建立別名,所謂的"別名",自己認爲就是另外起了一個名字,但是也不是這麼簡單。例如,我想查詢所有dept的deptName是"人力資源部"的emp
那麼我就應該用c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力資源部"));
這裏就能完成上面的查詢,其實createAlias也是做的left join

那麼,也就是說:
setFetchMode可以建立兩個表之間的連接,他建立連接的主要目的是爲了取出相應的數據,
但是不能只用setFetchMode進行查詢。例如,我們有:
c.setFetchMode("dept",FetchMode.JOIN);
c.add(Restrictions.eq("dept.deptName","人力資源部"));
如果只是這兩句話的話,肯定有錯誤的。

而createAlias主要是用於查詢,建立兩表之間的關係,查詢與兩個表相關的數據。


那麼上面的查詢這樣寫就可以了:
c.setFetchMode("dept",FetchMode.JOIN);
c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力資源部"));
這樣就可以既找出dept爲“人力資源部”的人,又把與他相關的員工給找出來了。

缺點:setFetchMode和createAlias都會讓數據庫中的表與其他的表join起來,那麼肯定查詢的效率就低了。
還有,程序在查詢的時候到底是外連接還是內連接我認爲還是與你xml裏面的配置是有關的。例如:你在emp的xml裏面配置與dept之間的關係是多對一關係,並且在數據庫裏面配置了外鍵關聯,那麼無論你setFetchMode設置爲什麼,這裏emp與dept進行關聯的時候都會是inner join。絕對不會是外連接,這樣寫的原因我認爲應該是與外鍵的關聯有關吧,由於外鍵的關係,emp的dept必須在dept中,所以纔會使用內連接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章