使用MyEclipse hibernate 視圖對ORACLE的視圖進行映射反向生成,比如對ViewResult視圖會生成兩個類,一個hbm.xml文件,其中兩個類名為:ViewResultId和ViewResult 配置文件為ViewResult.hbm.xml。那么使用HibernateTemplate模板類使用find(hql)進行查詢的時候,比如hql="from ViewResult v where v.name='lx'";那么會出現第一個異常(異常內容明天補上。。。)原因是:視圖沒有主鍵,MyEclipse默認生成的是復合主鍵,即<composite-id><key-property></key-property></composite-id>。id由ViewResult類生成,于是將hql修改為:hql="from ViewResult v where v.id.name='lx'";發現可以進行查詢不會報錯了,但是卻又發現查詢的內容為null,這是第二個異常,原因為:MyEclipse默認生成的復合主鍵,<composite=id></composite-id>中間包括了視圖所有的屬性都為復合主鍵即<key-property>屬性</key-property>,因為查詢的記錄里面某個字段為null,而主鍵不能為空,所以導致查詢的記錄全部都null,修改方法為:將視圖中可以作為主鍵的屬性放入<composite-id></composite-id>中,其余的放在外面修改為<property/>,這個時候查詢又會出現,缺少get或者set方法的異常,所以最終的解決方法就是:把視圖當成一個表,按hibernate常規思路進行配置即可解決,配置主鍵生成策略(視圖沒有主鍵,但是你可以根據業務需求找出一個可以當做主鍵的屬性值),然后配置屬性,這樣就可以把視圖當成一個實體用hql來查詢了。
ps:HibernateTemplate模板沒有提供分頁的查詢,只提供了setMaxResults(int)方法設置每頁顯示記錄數,但是沒有提供setFirstResult(int)設置從哪一行開始查詢,所以使用了doInhibernate(HibernateCallback)進行接口回調直接使用session進行設置查詢。當出現上述問題時候還以為是session關閉,使用了opensessionview過濾 但仍然報錯,最后還是映射問題。
posted on 2010-09-17 00:04
朔望魔刃 閱讀(5666)
評論(1) 編輯 收藏