hibernate调用存储过程及处理返回集合

来源:互联网 发布:知乎 鲥鱼多少钱 编辑:程序博客网 时间:2024/06/06 14:27

  项目中用到树结构,一般的需求是点击一次,请求一次数据库,加载它的子节点,但是现在有个需要,一次性加载所有节点,这就需要查出节点的层次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。

原创粉丝点击