Hibernate中的多表查詢及抓取策略
1.Hibernate中的多表查詢
1.1SQL中的多表查詢
【交叉連接】
select * from A,B;
【內(nèi)連接】
顯示內(nèi)連接:inner join(inner 可以省略)
Select * from A inner join B on 條件;
隱式內(nèi)連接:
Select * from A,B where 條件;
【外連接】
左外連接:left outer join
Select * from A left outer join B on 條件;
右外連接:right outer join
Select * from A right outer join B on 條件;
1.2Hibernate中的多表連接查詢
【交叉連接】
交叉連接
【內(nèi)連接】
顯示內(nèi)連接 from Customer c inner join c.linkmans
隱式內(nèi)連接
迫切內(nèi)連接from Customer c inner join fetch c.linkmans
【外連接】
左外連接
右外連接
迫切左外連接
2.Hibernate中的抓取策略
2.1 延遲加載lazy
lazy延遲加載: 查詢的時(shí)候不發(fā)送sql語(yǔ)句,在使用對(duì)象的時(shí)候才發(fā)送sql語(yǔ)句查詢
延遲加載氛圍類級(jí)別的延遲加載和關(guān)聯(lián)級(jí)別的延遲加載
2.1.1類級(jí)別的延遲加載
使用延遲加載的方法查詢某個(gè)類的時(shí)候是否采用的延遲稱為是類級(jí)別的延遲。默認(rèn)值是true。
Customer customer = session.load(Customer.class,1l);// 默認(rèn)就會(huì)采用延遲加載,這種稱為是類級(jí)別的延遲。
類級(jí)別延遲加載失效:
* final修飾這個(gè)類,不能產(chǎn)生代理類,延遲加載就會(huì)失效。
* 在<class>上配置lazy=”false”
2.1.2關(guān)聯(lián)級(jí)別的延遲加載
查詢到某個(gè)對(duì)象以后,獲得其關(guān)聯(lián)的對(duì)象。查詢其關(guān)聯(lián)對(duì)象的時(shí)候是否采用的延遲。稱為是關(guān)聯(lián)級(jí)別的延遲。
Customer c = session.get(Customer.class,1l); c.getLinkMans(); // 查詢關(guān)聯(lián)對(duì)象的時(shí)候,是否采用延遲加載。
關(guān)聯(lián)級(jí)別的延遲往往會(huì)與抓取策略一起使用,優(yōu)化程序。(關(guān)聯(lián)級(jí)別的延遲在<set>或者是<many-to-one>標(biāo)簽上的延遲加載)
2.2抓取策略
抓取策略指的是查找到某個(gè)對(duì)象后,抓取其關(guān)聯(lián)的對(duì)象的時(shí)候采用的策略。抓取策略就是在關(guān)聯(lián)對(duì)象的配置上(<set>和<many-to-one>)配置fetch屬性。
2.2.1 在set上配置的lazy和fetch
fetch:抓取策略,控制SQL語(yǔ)句的發(fā)送的格式。
* select :默認(rèn)值。發(fā)送一條select語(yǔ)句查詢關(guān)聯(lián)對(duì)象。
* join :發(fā)送一條迫切左外連接查詢關(guān)聯(lián)對(duì)象。
* subselect :發(fā)送一條子查詢查詢關(guān)聯(lián)對(duì)象。
lazy:延遲加載,控制SQL語(yǔ)句的發(fā)送的時(shí)候。
* true :默認(rèn)值。采用延遲加載。
* false :不采用延遲加載。
* extra :及其懶惰。
2.2.2 在many-to-one上配置的lazy和fetch
fetch:抓取策略,控制SQL語(yǔ)句的發(fā)送的格式。
* select :默認(rèn)值.發(fā)送一條select語(yǔ)句查詢關(guān)聯(lián)對(duì)象。
* join :發(fā)送一條迫切左外連接查詢關(guān)聯(lián)對(duì)象。
lazy:延遲加載,控制SQL的發(fā)送的時(shí)機(jī)。
* proxy :默認(rèn)值。是否采用延遲,需要由另一方類上的延遲加載來(lái)決定。
* false :不采用延遲加載。
* no-proxy:
2.2.3 批量抓取
批量抓?。翰樵兞硕鄠€(gè)客戶的時(shí)候,查詢多個(gè)客戶下的所有聯(lián)系人。
在Customer.hbm.xml中<set>上配置batch-size=”n”
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實(shí)踐
這篇文章主要介紹了springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Java返回分頁(yè)結(jié)果集的封裝代碼實(shí)例
這篇文章主要介紹了java返回分頁(yè)結(jié)果集的封裝代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問(wèn)題排查及解決
這篇文章主要介紹了記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問(wèn)題排查及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解
橋接,顧名思義,就是用來(lái)連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過(guò)示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09

