Hibernate關聯查詢

Hibernate關聯查詢有多種實現方式

方式一:建立視圖
像查詢表一樣查詢視圖,給視圖建立持久化類。

方式二:建立POJO之間的互相引用
在*.hbm或Annotation中配置"subclass"屬性,對應三種類型的關聯方式one-to-one/many-to-one/one-to-many.
需要謹慎的使用Lazy和fetch關鍵字,避免不必要的查詢,或者已經關閉Session後再查詢。


方式三:直接查詢,將結果保存在臨時對象中
比如有存在關聯的表A和表B字段分別如下
A:id,aName,aDesc
B:id,aId,bName,bDesc
希望查詢的結果是:A.id,B.id,A.aName,B.bName,B.bDesc

按照如下步驟操作:
1.創建A和B的hibernate映射,相互不用關聯,對應持久化類爲APojo和BPojo
2.創建結果集的載體CPojo,CPojo只是簡單的一個JavaBean不是持久化類,它的屬性與查詢結果相對應:

 

public class CPojo {
	public long aId;
	public long bId;
	public String aName;
	public String bName;
	public String bDesc;
	
	public CPojo(long aId, long bId, String aName, String bName, String bDesc) {
		this.aId = aId;
		this.bId = bId;
		this.aName = aName;
		this.bName = bName;
		this.bDesc = bDesc;
	}
}

3.HQL寫法:

Select new com.XXX.CPojo(a.id,b.id,a.aName,b.bName,b.bDesc) from A a,B b where a.id = b.aId

4.執行HQL獲取結果集
這種方式的優點:不需要建立複雜的持久化類,也不需要建立視圖。結果集可以自由定製。
需要注意的幾點:
1.CPojo必須把包名寫上,因爲CPojo並不是持久化類,Hibernate不能自動匹配。否則運行時異常,無法找到Class。
2.CPojo必須存在以上使用的構造函數(這好像是廢話)。
3.該HQL語句不會自動拆裝箱,比如APojo.id在映射文件中是Long型,但CPojo的構造函數裏是aId是long型,則運行時拋出異常無法找到構造函數。

 

      在這裏順便說一個Hibernate的小Bug,屬性aId如果是在持久化類中,則Hibernate會找不到相應的getter和setter,原因是自動生成的getAId或setAId不符合Hibernate默認讀取getter和setter的規則即:get後的兩個字母第一個必須大寫,第二個必須小寫。所以儘量避免在持久化類中使用aId(第二個字母大寫)這種類型的命名

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章