hibernate調用存儲過程及處理返回集合

  項目中用到樹結構,一般的需求是點擊一次,請求一次數據庫,加載它的子節點,但是現在有個需要,一次性加載所有節點,這就需要查出節點的層次level,如果用Oracle數據庫,可以用START WITH...CONNECT BY PRIOR子句實現遞歸查詢,但現在項目中用的是Mysql,ssh框架,苦想了好久,存儲過程中的查詢是不是也得按照hibernate的要求來寫,比如說,查詢實體類必須用from + 實體類,但是這個存儲過程是用中間表實現的,中間表是在存儲過程中創建的,沒有映射,這下子麻煩了,卡在這裏,想了好久,最後還是決定試一試吧,寫完了存儲過程以後,用hibernate調用,嘿,成功,功夫不負有心人,實踐證明了hibernate調用存儲過程,存儲過程中的表不需要映射,直接查即可。

菜單樹結構

BEGIN
DECLARE _level_var INT; //節點層次
 
DROP TABLE IF EXISTS temp_child_list; //中間表,其中的字段是程序中需要的字段。
CREATE TABLE temp_child_list (
_menuId int,  //菜單id
_menuName varchar(100),
_menuLocType varchar(20),
_level int
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET _level_var = 0;
  INSERT INTO temp_child_list (_menuId,_menuName,_menuLocType,_level) VALUE(rootid,'功能菜單','',_level_var);
SET _level_var = _level_var + 1;
INSERT INTO temp_child_list (_menuId,_menuName,_menuLocType,_level)
SELECT
menu_id,
menuName,
menuLocType,
_level_var
FROM
ele_sys_menu
WHERE
parent_id = rootid;
WHILE ROW_COUNT() > 0
DO
SET _level_var = _level_var + 1;
INSERT INTO temp_child_list SELECT
a.menu_id,
a.menuName,
a.menuLocType,
_level_var
FROM
ele_sys_menu a,
temp_child_list b
WHERE
a.parent_id = b._menuId
AND b._level = _level_var - 1;
END WHILE;
  SELECT tcl._menuId,tcl._menuName,tcl._menuLocType,tcl._level FROM temp_child_list tcl ORDER BY tcl._level;
  DROP TABLE IF EXISTS temp_child_list;
END

hibernate調用

SQLQuery  query = this.getSession().createSQLQuery("{Call getChildMenu(-1)}");

List list = query.list();

返回結果爲list,查出來很高興,於是接着往下做,強制轉換成什麼類型呢,到這裏又有問題了,搜了點資料,發現需要這麼幹

public List selectMenuTreeAll() throws Exception  {
        SQLQuery  query = this.getSession().createSQLQuery("{Call getChildMenu(-1)}");
        query.addScalar("_menuId",Hibernate.INTEGER);
        query.addScalar("_menuName",Hibernate.STRING);
        query.addScalar("_menuLocType",Hibernate.STRING);
        query.addScalar("_level",Hibernate.INTEGER);
        List list = query.list();
        List results = new ArrayList();
        System.out.println(list.size()+"kkkkkkkkkkkkkkkk");
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            Object[] object = (Object[])iterator.next();
            int menuId = (Integer)object[0];
            System.out.println(menuId);
            String menuName = (String)object[1];
            System.out.println(menuName);
            String menuLocType = (String)object[2];
            System.out.println(menuLocType);
            int level = (Integer)object[3];
            System.out.println(level);
            TempChildList childList = new TempChildList(menuId,menuName,menuLocType,level);
            results.add(childList);
            
        }
        
        return results;

}

ok,搞定,這樣就好了。ok,perfect。

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