通过parentid作为Map主键迭代法只查询一次数据库就生成树

树迭代通常会通过子parentid等父的id的方式生成树。所以,生成树的时候通常动态去用上一级的id去找下一级的parentid。这样要经过多次数据库查询才能把树展示出来,效率比较低。
可以一次把所有节点parentid作排序查询出来,将parentid相同的节点对象压入一个list,然后以parentid作为主键将list压入一个hashmap。然后通过从hashMap里获取顶端parentid的list开始遍历递归找每个节点的id作为主键的hashMap,hashMap里放放的就是他的子节点list。如果hashMap不含该主键则表明是根节点。


/**
* 通过上级代号获取下级机构,加载机构树
* @param parentid 上级代号
* @return
*/
public DTO getProductOrganTree(DTO p_dto) throws Exception {
DTO r_dto = new DTO();
List list = null;

String productid = (String) p_dto.get("productid");
String userid = (String) p_dto.get("userid");

list=(List)this.userDAO.queryhashmap("select * from v_organ order by parentid");

Map<String, List> parentidMap = new HashMap();
Map<String, String> containMap = new HashMap();

String parentid = "";
String lastparentid = "";
List listorgan = null;
for(Iterator it=list.iterator(); it.hasNext();)
{

Map map = (Map) it.next();
parentid = map.get("parentid").toString();
if(parentid==null||"".equals(parentid))
parentid = "0";
if(!lastparentid.equals(parentid))
{
if(listorgan!=null)
parentidMap.put(lastparentid, listorgan);
listorgan = new ArrayList();
lastparentid = parentid;
}
listorgan.add(map);
}
parentidMap.put(lastparentid, listorgan);


list=(List)this.userDAO.queryhashmap("select * from v_pou where userid='" + userid + "' and productid='" + productid + "'");
for(Iterator it=list.iterator(); it.hasNext();)
{
Map map = (Map) it.next();
containMap.put(map.get("organid").toString(), "");
}

String json = getTreeNodeJson(parentidMap,containMap,"0");

r_dto.put("result",json);
return r_dto;
}

/**
* 通过parentidMap 叠带树
* @param parentidMap
* @param parentid
* @return
*/
private String getTreeNodeJson(Map parentidMap,Map containMap,String parentid){
StringBuilder builder = new StringBuilder("[");
List list = (List) parentidMap.get(parentid);
for (int i=0; i < list.size(); ++i) {
HashMap map = (HashMap)list.get(i);
String id=map.get("id")==null ?"":map.get("id").toString().trim();
String text=map.get("text")==null ?"":map.get("text").toString().trim();
String iconcls="foler";

if (builder.length() > 1)
builder.append(",");
builder.append("{\"id\":\"").append(id).append("\"")
.append(",\"text\":\"").append(text).append("\"")
.append(",\"cls\":\"").append(iconcls).append("\"");

if(containMap.containsKey(id))
{
builder.append(",\"checked\":").append(true);
}
else
{
builder.append(",\"checked\":").append(false);
}
递规子类 start
if(parentidMap.containsKey(id))
{
builder.append(",\"children\":");
builder.append(getTreeNodeJson(parentidMap,containMap,id));
}
else
builder.append(",\"leaf\":true");
递规子类 end
builder.append("}");

}
builder.append("]");
return builder.toString();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值