Hibernate查詢視圖返回null問題說明及解決辦法


在Hibernate中對含有主鍵的單表操作比較簡單,直接使用Hibernate針對數據庫表對象進行反向生成代碼,直接調用就可以了。但是在實際項目當中,經常會用到不少的多表聯合查詢操作,網上有很多示例,在這里就不多解釋了。

針對多表操作有一種簡單的處理辦法就是添加數據庫視圖,將多表操作轉換為類似單表操作來進行查詢或其他操作。但在實際生成代碼然后進行調用的時候你會發現和單表操作有些不一樣,在xxxDAO.java文件中多了一個getId和setId方法。這是為什么呢?是因為視圖無主鍵,這個時候Hibernate會將這個對象識別為復合主鍵對象,這里所知的復合主鍵是將所查詢到的所有字段均變為主鍵。看到這里也許你認為沒有什么不一樣,按照生成代碼中的提示進行調用就可以了。但在實際操作的時候也許你會發現並沒有想象的那么“簡單”。

在實際調用的時候如果查詢視圖中的數據所有列中存在null值,那么恭喜你,你的程序將會提示NullException錯誤,檢查代碼和數據庫腳本,始終找不到問題,接下來肯定是上網到處搜索。如果你有幸看到這篇文章,那么恭喜你不用再找了。呵呵

廢話少說,在使用list.get(0).getId()的時候提示null是因為Hibernate針對無主鍵視圖操作的時候,不允許查詢數據中存在null,如果存在,則返回數據為null,和你自己的代碼沒有關系,不要懷疑自己的能力。

解決方法有兩個:

第一個方法比較簡單,就是直接給視圖添加主鍵,下面示例oracle中針對視圖進行添加主鍵,這樣就可以將視圖操作變為單表操作,在生成代碼中就沒有getId和setId方法了。

create or replace view view_XXX(
aid,aname,bid,bname,
constraint "Pri_XXX" primary key (aid) rely disable
)
as
select a.aid , a.aname , b.bid , b.bname
from table1 a , table b
where a.aid = b.aid

第二個方法比較復雜一點,就是給可能出現null的字段增加默認值。

以上是我的解決辦法,歡迎和大家多多溝通學習,如有任何改進意見和建議,我的QQ是1243672,歡迎聯系哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM