hibernate鏈接查詢的使用

之前用hibernate在處理鏈接查詢都是使用建立新的映射實體來獲取查詢結果,效率低,使用也不方便,最近工做中查閱官方文檔後發現hibernate是支持鏈接查詢操做的。java

當程序須要從多個數據表中獲取數據時,Hibernate使用關聯映射來處理底層數據表之間的鏈接,一旦咱們提供了正確的關聯映射後,當程序經過Hibernate進行持久化訪問時,將可利用Hibernate的關聯來進行鏈接。sql

hql的鏈接查詢包括:隱式(implicit)顯式(explicit)數據庫

隱式查詢dom

  1. 使用"."隱式鏈接關聯實體fetch

  2. 隱式鏈接底層將轉換成爲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

  1. 顯式查詢使用如下關鍵字code

    inner join(內鏈接) 可簡寫成 join對象

    left outer join(左外鏈接),可簡寫成 left joinci

  2. right outer join(右外鏈接),可簡寫成right join

  3. full join(全鏈接),並不經常使用。

  4. 其中「with」的做用至關於SQL中的 「on」

  5. 使用顯式鏈接時能夠爲相關聯的實體,甚至是關聯集合中的所有元素指定一個別名。

  6. 須要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="**")中指定的名字即數據庫表中名字,不然會報錯
 */
相關文章
相關標籤/搜索