jdbc 递归无限极tree

皮卡丘_后盾 2015-02-27 11:37:15
现在是写死的两层,但是考虑以后可能不止两层,想写一个无限极的,无论多少成都可以生成一个List<TreeData>,递归写老是出错,所以请教一下各位大哥


public static List<TreeData> findMenuTreeData(String roleUuid) {
List<TreeData> list=new ArrayList<TreeData>();
try {
PQL pql = new PQL();
session = pql.getDefaultDataSource().createSession();
String sql = "SELECT * FROM systemaction WHERE UUID IN(SELECT actionuuid FROM systemactiongroup WHERE roleuuid='"+roleUuid+"') AND puuid='0' AND ismenu='1'";
SqlResultSet rs = session.queryBySQL(sql);
while (rs.next()) {//第一层
TreeData td=new TreeData();
td.setId(rs.getString("uuid"));
td.setText(rs.getString("actionname"));
td.setAttributes(new ItemData(rs.getString("action") , rs.getString("actionname")));
List<TreeData> sublist=new ArrayList<TreeData>();
String sql2 = "SELECT * FROM systemaction WHERE UUID IN(SELECT actionuuid FROM systemactiongroup WHERE roleuuid='"+roleUuid+"') AND puuid='"+td.getId()+"' AND ismenu='1'";
SqlResultSet rs2 = session.queryBySQL(sql2);
while (rs2.next()) {//第二层
TreeData t=new TreeData();
t.setId(rs2.getString("uuid"));
t.setText(rs2.getString("actionname"));
t.setAttributes(new ItemData(rs2.getString("action"), rs.getString("actionname")+">--->"+rs2.getString("actionname")));
sublist.add(t);
}
td.setChildren(sublist);//将第二层设为第一层子节点
list.add(td);//最后都加到list中便于前台展示
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (null != session) session.closeSession();
}
return list;
}


public static void main(String[] args) {
List<TreeData> list = new ArrayList<TreeData>();
List<TreeData> datas = AuthorityHelper.findMenuTreeData("0O5v62zr3b");
for (int i = 0; i < datas.size(); i++) {
System.out.println(datas.get(i).getAttributes().getTitle() + "\t" + datas.get(i).getAttributes().getUrl());
for (int j = 0; j < datas.get(i).getChildren().size(); j++) {
System.out.println("-----\t"+datas.get(i).getChildren().get(j).getAttributes().getTitle() + "\t" + datas.get(i).getChildren().get(j).getAttributes().getUrl());
}
}
}
...全文
247 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
皮卡丘_后盾 2015-02-28
  • 打赏
  • 举报
回复
引用 2 楼 zys59 的回复:
不知道你的数据库表的结构,只能说说我的思路。下面是伪代码,按照这个思路你可以解决你的问题
public List<TreeData> ff(pid){
	新建一个List<TreeData>对象 list	
	根据pid查询数据库得到记录集rs
	遍历rs{
		新建一个TreeData对象td
		取出一条记录r
		用r对td的各个属性赋值
		如果r的isMenu属性为true{
			以r的id为参数,调用ff()     //注意:这一步就是所谓的递归调用
			将得到的结果赋予td的sublist属性
		}
		将td加入list
	}
	返回list
}
谢了,思路正确了写出来了
上帝的无名指 2015-02-28
  • 打赏
  • 举报
回复
楼主写的明显不对呀,都没有递归调用,咋叫递归呢
wula0010 2015-02-27
  • 打赏
  • 举报
回复
既然都无限级了,不要一次加载完吧?应该考虑动态加载,按需加载..............
三仙半 2015-02-27
  • 打赏
  • 举报
回复
不知道你的数据库表的结构,只能说说我的思路。下面是伪代码,按照这个思路你可以解决你的问题
public List<TreeData> ff(pid){
	新建一个List<TreeData>对象 list	
	根据pid查询数据库得到记录集rs
	遍历rs{
		新建一个TreeData对象td
		取出一条记录r
		用r对td的各个属性赋值
		如果r的isMenu属性为true{
			以r的id为参数,调用ff()     //注意:这一步就是所谓的递归调用
			将得到的结果赋予td的sublist属性
		}
		将td加入list
	}
	返回list
}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧