项目中用到树结构,一般的需求是点击一次,请求一次数据库,加载它的子节点,但是现在有个需要,一次性加载所有节点,这就需要查出节点的层次level,如果用Oracle数据库,可以用START WITH...CONNECT BY PRIOR子句实现递归查询,但现在项目中用的是Mysql,ssh框架,苦想了好久,存储过程中的查询是不是也得按照hibernate的要求来写,比如说,查询实体类必须用from + 实体类,但是这个存储过程是用中间表实现的,中间表是在存储过程中创建的,没有映射,这下子麻烦了,卡在这里,想了好久,最后还是决定试一试吧,写完了存储过程以后,用hibernate调用,嘿,成功,功夫不负有心人,实践证明了hibernate调用存储过程,存储过程中的表不需要映射,直接查即可。 菜单树结构 BEGIN 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。 |
|