之前用hibernate在處理鏈接查詢都是使用建立新的映射實體來獲取查詢結果,效率低,使用也不方便,最近工做中查閱官方文檔後發現hibernate是支持鏈接查詢操做的。java
當程序須要從多個數據表中獲取數據時,Hibernate使用關聯映射來處理底層數據表之間的鏈接,一旦咱們提供了正確的關聯映射後,當程序經過Hibernate進行持久化訪問時,將可利用Hibernate的關聯來進行鏈接。sql
hql的鏈接查詢包括:隱式(implicit)與顯式(explicit)。數據庫
隱式查詢dom
使用"."隱式鏈接關聯實體fetch
隱式鏈接底層將轉換成爲SQL99的交叉鏈接spa
from person as p where p.myEvents.titile > :title --底層轉化後 select person0_.person_id as person1_0_, person0_.name as name_0, person0_.age as age0_, person0_.event_id as event4_0_ from person person0_ cross join event myevent1_ where person0_.event_id = myevent1_.event_id and myevent1_.title > ?
顯式查詢hibernate
顯式查詢使用如下關鍵字code
inner join(內鏈接) 可簡寫成 join對象
left outer join(左外鏈接),可簡寫成 left joinci
right outer join(右外鏈接),可簡寫成right join
full join(全鏈接),並不經常使用。
其中「with」的做用至關於SQL中的 「on」
使用顯式鏈接時能夠爲相關聯的實體,甚至是關聯集合中的所有元素指定一個別名。
須要SQL底層的支持
from person p inner join p.myEvent event with p.eventId = event.id where p.name like '%劉%' --底層轉化後 select person0_.person_id as person1_0_, person0_.name as name0_, person0_.age as age0_, person0_.event_id as event4_0_ from person person0_ left outer join event myevent1_ on person0_.event_id = myevent1_.event_id where person0_.name like '%劉%'
項目中使用的狀況:
//實體domain對象 public class ExpertException{ /** * 專家ID(外鍵關聯ExpertBasicinfo實體) */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="EXPERT_ID", referencedColumnName = "ID") private ExpertBasicinfo expertBasicinfo; } //DAO中使用的sql語句,執行查詢後,返回ExpertException實體的List集合 String queryString = "select e from ExpertException e " + "left join " + "e.expertBasicinfo i where 1=1"; /* * ps:一、這裏在ExpertException中配置了@ManyToOne(fetch = FetchType.Lazy) * 可沒必要再 「left join」 後加 「fetch」 可實現懶加載的級聯抓取 * 二、這裏,where後面若是還要加查詢條件,查詢的屬性沒必要用"object.property"的形式,直接使用屬性名集合 * 可是這裏的屬性名字必須是@Column(name="**")中指定的名字即數據庫表中名字,不然會報錯 */