分享

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

 instl 2014-03-20
 

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

分类: mysql oracle hibernate 862人阅读 评论(0) 收藏 举报

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

更多0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多