今天作項目第一次用到Hibernate的formula,解決了困擾了很長時間的一個問題 sql
之前作各類層級樹的時候,查詢結點是否是葉子結點,若是是葉子節點就直接展開圖標,當時想到了幾種解決方案可是總感受彆扭,今天看hibernate書籍的時候看到了formula能夠解決關於派生屬性的映射,把項目中的代碼重構了一下,頓時感受很不錯。 性能
之前的解決方案以下: spa
解決方案一:在對應的entry上面作一個一對多關聯,而後再建立一個臨時字段 .net
@Transient hibernate
private String shiFouYZJD orm
在getShiFouYZJD()中判斷關聯查詢的set集合是否是empty,而後給shiFouYZJD附上對應的標識位,這種作法理解是好理解,可是當個人樹層級超過三級樹上節點數目超過一萬就掛了,舉個例子假如第二層節點有一百個,每一個節點下再掛100個子節點。。。那麼關聯查詢內存中存放的對象你懂得100*100.。。。 對象
性能很受影響。 內存
解決方案二:寫sql,用createSQLQuery而後獲得一個List<Object[]> 類型的集合。。。緊接着作遍歷new個實體而後使勁的set值。。若是一個表中有30個字段。。。你會瞬間崩潰的各類if(value!=null),最後功能實現了,可是代碼你本身看的都蛋疼。。你本身都會想到確定會有比這好的方法 get
今天用了formula感受不錯,簡單介紹下用法,很簡單可是之前真沒注意到這個 form
@formula(select nvl(count(1),0) from danweixx d where d.shangji=danweidm)
private String shiFouYZJD;
而後對應的查詢hql就直接hql = 「from **Entry」