请问下面的代码,该怎么优化一下,可以减少查询的时间?

streamlong 发布于 2011/09/26 15:21
阅读 402
收藏 0
public JSONArray addJSON(Integer id, JSONArray array, String type) {
	Integer pId = null;
	if(type != null && type.equals("Group")) {
			DetachedCriteria dc1 = DetachedCriteria.forClass(VirtualGroup.class);
			List<VirtualGroup> vs = tbDepartmentTreeService.findAllByCriteria(dc1);
			if(vs != null) {
				for(VirtualGroup v : vs) {
					JSONObject json = new JSONObject();
					json.put("id", v.getId());
					json.put("name", v.getGroupName());
					array.add(json);
				}
			} 
			return array;
		} 
		DetachedCriteria dc1 = DetachedCriteria.forClass(TbDepartmentTree.class);
		if(id == null) {
			dc1.add(Restrictions.isNull("tbDepartmentTree.deparetId"));
		} else {
			dc1.add(Restrictions.eq("tbDepartmentTree.deparetId", id));
		}
		dc1.addOrder(Order.asc("sequence"));
		List<TbDepartmentTree> t1 = tbDepartmentTreeService.findAllByCriteria(dc1);
		if(t1 != null) {
			for(TbDepartmentTree t : t1) {
				JSONObject json = new JSONObject();
				json.put("id", t.getDeparetId());
				if(id == null) {
					if(t.getSequence() == 1) {
						pId = t.getDeparetId();
						json.put("pId", 0);
					} else {
						json.put("pId", pId);
					}
					json.put("open", false);
					json.put("nochecked", true);
				} else {
					json.put("pId", id);
				}
				json.put("name", t.getDeparetName());
				array.add(json);
				if(type != null && type.equals("User")) {
					DetachedCriteria dc = DetachedCriteria.forClass(TbUser.class);
					dc.add(Restrictions.eq("department.deparetId", t.getDeparetId()));
					List<TbUser> users = tbUserService.findAllByCriteria(dc);
					if(users != null) {
						for(TbUser user : users) {
							JSONObject json1 = new JSONObject();
							json1.put("id", user.getUserId());
							json1.put("pId", t.getDeparetId());
							json1.put("name", user.getFullName());
							array.add(json1);
						}
					}
				}
				addJSON(t.getDeparetId(), array, type);
			}
		}
    	return array;
	}

这是个递归方法,在部门下挂人员时,耗时7点多秒,该怎么优化一下,提高一下效率?
加载中
0
鉴客
鉴客

你应该打开 hibernate 的 show_sql 开关,然后看这段代码对应的是什么 SQL 语句,拿着这个 SQL 语句去数据库上 EXPLAIN 一下,检查索引。

这种性能一般跟代码无关的,跟数据库结构有关。

streamlong
streamlong
0
小样
小样

优化,从查询优化,查询时候,返回你需要的字段,不必要全部查询出来。从循环中优化,循环中,尽量减少过多的if else 语句。当有双重循环时候,数据最大的摆在内层循环,减少cpu内存开销。

streamlong
streamlong
嗯,又见知识了,谢谢。
返回顶部
顶部