天天看點

關于hibernate純sql查詢傳回結果集的問題(hbm.xml中不寫多表關聯)

相信用過hibernate的兄弟們都會因為多表複雜查詢後,為傳回的結果如何組裝到一個vo中而煩惱不已。我也不停的為此而煩惱,但是在看了hibernate的transform後,感覺這個方法還挺管用的。 

例如現在有兩張表,一張是user表,放了一些使用者的資訊,另外一張表是使用者發表的文章,裡邊有一個user的外鍵。我們需要查詢出來,某個人釋出的文章,sql如下:

select  u.username, p.title, p.addtime 

from user as u,post as p 

where u.id=p.userid

但是我們的pojo映射僅僅是做了user,post表的映射,這個時候,我們需要寫一個postvo類,裡邊放着了使用者的資訊和文章的資訊的屬性,設定get\set方法,務必保證這個類裡邊有一個預設的構造函數。

然後我們開始寫這個資料庫操作的dao,代碼如下:

string sql = "select u.username as username p.title as title,p.addtime as addtime "+

"from user as u,post as p"+

"where u.id=p.userid"  ;

query q = factory.getcurrentsession().createsqlquery(sql).setresulttransformer(transformers.aliastobean(postvo.class));  

紅字部分必須跟postvo中的屬性一直,這樣就可以傳回一個針對postvo的一個集合。

其實大家可以看下hibernate這一部分的源碼就會發現,主要是使用了aliastobeanresulttransformer這個類,通過sql的查詢,會傳回數組,然後 hibernate根據資料表的映射,自動幫我們來set對應的字段屬性,是以标紅的部分務必要跟vo中的屬性值一直,要不然會報錯的。

如果需要的話,大家也可以重寫這個類。例如voresulttransformer。然後在dao中更改成

setresulttransformer(new voresulttransformer(postvo.class)); 

原帖位址:http://glamey.iteye.com/blog/721019