5
回答
jfinal实现jQuery easyUI树的异步加载
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

@JFinal 你好,想跟你请教个问题:

jfinal如何实现对数据库中数据的遍历,比如有下面的一张表,根据id=0;可以读出parentId=0的两条数据,应该如何操作才能实现对这两条数据的遍历

+-------+--------------+----------+
| id    | name         | parentId |
+-------+--------------+----------+
|     0 | 数据表分类根 | NULL     |
|     1 | 一级数据     |        0 |
|     2 | 二级数据     |        0 |
| 10001 | 基本信息     |        1 |
| 10002 | 教师信息     |        1 |
| 20001 | 基本信息     |        2 |
| 20002 | 教师信息     |        2 |
+-------+--------------+----------+
7 rows in set



举报
共有5个答案 最后回答: 3年前

没明白你的问题,如果是遍历,你给出来的就是全表数据吧。

我觉得你是想问递归求出给定ID及这些ID下的枝叶数据吧,有些数据库无法用一条SQL实现递归,所以得先清楚你用的什么数据库。

引用来自“糊搞”的评论

没明白你的问题,如果是遍历,你给出来的就是全表数据吧。

我觉得你是想问递归求出给定ID及这些ID下的枝叶数据吧,有些数据库无法用一条SQL实现递归,所以得先清楚你用的什么数据库。

恩恩,我的意思就是你说的,根据父节点ID,得到子节点的数据,我用的是mysql数据库,得到的子节点数据有多条,如何实现对他们的遍历

在EasyUi中,树的实现有些麻烦,我给出我写的Kit类,希望对你有帮助:

/**
 * @author hugao
 * 
 */
public final class EasyUiKit {

	/**
	 * EasyUi的grid对象,可用于TreeGrid和DataGrid
	 * 
	 * @author hugao
	 *
	 * @param <M>
	 *            JFinal的Model泛型
	 */
	public static class EasyUiGridObject<M extends Model<?>> {
		/**
		 * Model列表,如果用于TreeGrid,此列表是带有Tree结构的列表。
		 */
		private List<M> rows;

		/**
		 * 总行数
		 */
		private int total;

		/**
		 * 构造方法
		 * 
		 * @param total
		 *            总行数
		 * @param rows
		 *            Model列表
		 */
		public EasyUiGridObject(int total, List<M> rows) {
			this.total = total;
			this.rows = rows;
		}

		public List<M> getRows() {
			return rows;
		}

		public int getTotal() {
			return total;
		}

		public void setRows(List<M> rows) {
			this.rows = rows;
		}

		public void setTotal(int total) {
			this.total = total;
		}
	}

	private static final String EASYUI_GRID_PARENT_ID_NAME = "_parentId";

	private static final String EASYUI_TREE_CHILDREN_NAME = "children";

	private static final String EASYUI_TREE_TEXT_NAME = "text";

	/**
	 * 取得EasyUi的DataGrid控件数据的EasyUiGridObject对象
	 * 
	 * @param page
	 *            JFinal中的Page对象
	 * @return 包装EasyUi的DataGrid控件数据的EasyUiGridObject对象
	 */
	public static <M extends Model<?>> EasyUiGridObject<M> toDataGridObject(Page<M> page) {
		return new EasyUiKit.EasyUiGridObject<M>(page.getTotalRow(), page.getList());
	}

	/**
	 * 取得EasyUi中Tree控件结构的Model列表
	 * 
	 * @param modelList
	 *            包含所有数据的Model列表
	 * @param idFieldName
	 *            Model中ID字段名称
	 * @param parentIdFieldName
	 *            Model中父ID字段名称
	 * @param textFieldName
	 *            Model中名称字段名称,对应EasyUi的Tree控件中的text字段
	 * @param rootIdValue
	 *            根ID字段值
	 * @return 符合EasyUi中Tree控件结构的Model列表
	 */
	public static <M extends Model<?>> List<M> toTree(List<M> modelList, String idFieldName,
			String parentIdFieldName, String textFieldName, Object rootIdValue) {
		return toTree(modelList, idFieldName, parentIdFieldName, textFieldName, rootIdValue, 1);
	}

	/**
	 * 取得EasyUi中Tree控件的子树节点
	 * 
	 * @param modelList
	 *            包含所有数据的Model列表
	 * @param idFieldName
	 *            Model中ID字段名称
	 * @param parentIdFieldName
	 *            Model中父ID字段名称
	 * @param textFieldName
	 *            Model中名称字段名称,对应EasyUi的Tree控件中的text字段
	 * @param parentIdValue
	 *            父ID字段值
	 * @param level
	 *            树层级
	 * @return EasyUi中Tree控件的子树节点
	 */
	private static <M extends Model<?>> List<M> toTree(List<M> modelList, String idFieldName,
			String parentIdFieldName, String textFieldName, Object parentIdValue, int level) {
		List<M> retList = new ArrayList<M>();

		// 循环处理所有model
		for (M m : modelList) {
			// 取得父ID字段值
			Object id = m.get(parentIdFieldName);

			// ID和传入的parentIdValue值是否相等
			if ((parentIdValue == null && id == null)
					|| (parentIdValue != null && parentIdValue.equals(id))) {
				// 如果相等,说明当前Model是子项,直接加入列表
				retList.add(m);

				// 递归地将当前Model的子树求出
				List<M> childrenList = toTree(modelList, idFieldName, parentIdFieldName,
						textFieldName, m.get(idFieldName), level + 1);

				// 子项列表,存放在children字段,此字段为指定字段
				m.put(EASYUI_TREE_CHILDREN_NAME, childrenList);

				// 如果Model中不存在text字段,则填充text字段,因为text字段是Tree控件指定字段
				if (!EASYUI_TREE_TEXT_NAME.equals(textFieldName)) {
					m.put(EASYUI_TREE_TEXT_NAME, m.getStr(textFieldName));
				}
			}
		}

		return retList;
	}

	/**
	 * 取得EasyUi的TreeGrid控件数据的EasyUiGridObject对象
	 * 
	 * @param modelList
	 *            包含所有数据的Model列表
	 * @param parentIdFieldName
	 *            父ID字段名
	 * @param rootIdValue
	 *            根ID字段值
	 * @return 包装EasyUi的TreeGrid控件数据的EasyUiGridObject对象
	 */
	public static <M extends Model<?>> EasyUiGridObject<M> toTreeGridObject(List<M> modelList,
			String parentIdFieldName, Object rootIdValue) {
		for (M m : modelList) {
			Object id = m.get(parentIdFieldName);
			if ((rootIdValue == null && id == null)
					|| (rootIdValue != null && rootIdValue.equals(id))) {
			} else {
				m.put(EASYUI_GRID_PARENT_ID_NAME, m.get(parentIdFieldName));
			}
		}

		return new EasyUiKit.EasyUiGridObject<M>(modelList.size(), modelList);
	}
}



调用方式如下例:

this.renderJson(EasyUiKit.toTree(Permission.dao.find("select * from sys_permission order by order_num"), "id",	"parent_name", "name", null));



引用来自“糊搞”的评论

没明白你的问题,如果是遍历,你给出来的就是全表数据吧。

我觉得你是想问递归求出给定ID及这些ID下的枝叶数据吧,有些数据库无法用一条SQL实现递归,所以得先清楚你用的什么数据库。

引用来自“求一个网名”的评论

恩恩,我的意思就是你说的,根据父节点ID,得到子节点的数据,我用的是mysql数据库,得到的子节点数据有多条,如何实现对他们的遍历

MySQL不支持一条SQL就能递归取树,只能使用存储过程来解决。

引用来自“糊搞”的评论

在EasyUi中,树的实现有些麻烦,我给出我写的Kit类,希望对你有帮助:

/**
 * @author hugao
 * 
 */
public final class EasyUiKit {

	/**
	 * EasyUi的grid对象,可用于TreeGrid和DataGrid
	 * 
	 * @author hugao
	 *
	 * @param <M>
	 *            JFinal的Model泛型
	 */
	public static class EasyUiGridObject<M extends Model<?>> {
		/**
		 * Model列表,如果用于TreeGrid,此列表是带有Tree结构的列表。
		 */
		private List<M> rows;

		/**
		 * 总行数
		 */
		private int total;

		/**
		 * 构造方法
		 * 
		 * @param total
		 *            总行数
		 * @param rows
		 *            Model列表
		 */
		public EasyUiGridObject(int total, List<M> rows) {
			this.total = total;
			this.rows = rows;
		}

		public List<M> getRows() {
			return rows;
		}

		public int getTotal() {
			return total;
		}

		public void setRows(List<M> rows) {
			this.rows = rows;
		}

		public void setTotal(int total) {
			this.total = total;
		}
	}

	private static final String EASYUI_GRID_PARENT_ID_NAME = "_parentId";

	private static final String EASYUI_TREE_CHILDREN_NAME = "children";

	private static final String EASYUI_TREE_TEXT_NAME = "text";

	/**
	 * 取得EasyUi的DataGrid控件数据的EasyUiGridObject对象
	 * 
	 * @param page
	 *            JFinal中的Page对象
	 * @return 包装EasyUi的DataGrid控件数据的EasyUiGridObject对象
	 */
	public static <M extends Model<?>> EasyUiGridObject<M> toDataGridObject(Page<M> page) {
		return new EasyUiKit.EasyUiGridObject<M>(page.getTotalRow(), page.getList());
	}

	/**
	 * 取得EasyUi中Tree控件结构的Model列表
	 * 
	 * @param modelList
	 *            包含所有数据的Model列表
	 * @param idFieldName
	 *            Model中ID字段名称
	 * @param parentIdFieldName
	 *            Model中父ID字段名称
	 * @param textFieldName
	 *            Model中名称字段名称,对应EasyUi的Tree控件中的text字段
	 * @param rootIdValue
	 *            根ID字段值
	 * @return 符合EasyUi中Tree控件结构的Model列表
	 */
	public static <M extends Model<?>> List<M> toTree(List<M> modelList, String idFieldName,
			String parentIdFieldName, String textFieldName, Object rootIdValue) {
		return toTree(modelList, idFieldName, parentIdFieldName, textFieldName, rootIdValue, 1);
	}

	/**
	 * 取得EasyUi中Tree控件的子树节点
	 * 
	 * @param modelList
	 *            包含所有数据的Model列表
	 * @param idFieldName
	 *            Model中ID字段名称
	 * @param parentIdFieldName
	 *            Model中父ID字段名称
	 * @param textFieldName
	 *            Model中名称字段名称,对应EasyUi的Tree控件中的text字段
	 * @param parentIdValue
	 *            父ID字段值
	 * @param level
	 *            树层级
	 * @return EasyUi中Tree控件的子树节点
	 */
	private static <M extends Model<?>> List<M> toTree(List<M> modelList, String idFieldName,
			String parentIdFieldName, String textFieldName, Object parentIdValue, int level) {
		List<M> retList = new ArrayList<M>();

		// 循环处理所有model
		for (M m : modelList) {
			// 取得父ID字段值
			Object id = m.get(parentIdFieldName);

			// ID和传入的parentIdValue值是否相等
			if ((parentIdValue == null && id == null)
					|| (parentIdValue != null && parentIdValue.equals(id))) {
				// 如果相等,说明当前Model是子项,直接加入列表
				retList.add(m);

				// 递归地将当前Model的子树求出
				List<M> childrenList = toTree(modelList, idFieldName, parentIdFieldName,
						textFieldName, m.get(idFieldName), level + 1);

				// 子项列表,存放在children字段,此字段为指定字段
				m.put(EASYUI_TREE_CHILDREN_NAME, childrenList);

				// 如果Model中不存在text字段,则填充text字段,因为text字段是Tree控件指定字段
				if (!EASYUI_TREE_TEXT_NAME.equals(textFieldName)) {
					m.put(EASYUI_TREE_TEXT_NAME, m.getStr(textFieldName));
				}
			}
		}

		return retList;
	}

	/**
	 * 取得EasyUi的TreeGrid控件数据的EasyUiGridObject对象
	 * 
	 * @param modelList
	 *            包含所有数据的Model列表
	 * @param parentIdFieldName
	 *            父ID字段名
	 * @param rootIdValue
	 *            根ID字段值
	 * @return 包装EasyUi的TreeGrid控件数据的EasyUiGridObject对象
	 */
	public static <M extends Model<?>> EasyUiGridObject<M> toTreeGridObject(List<M> modelList,
			String parentIdFieldName, Object rootIdValue) {
		for (M m : modelList) {
			Object id = m.get(parentIdFieldName);
			if ((rootIdValue == null && id == null)
					|| (rootIdValue != null && rootIdValue.equals(id))) {
			} else {
				m.put(EASYUI_GRID_PARENT_ID_NAME, m.get(parentIdFieldName));
			}
		}

		return new EasyUiKit.EasyUiGridObject<M>(modelList.size(), modelList);
	}
}



调用方式如下例:

this.renderJson(EasyUiKit.toTree(Permission.dao.find("select * from sys_permission order by order_num"), "id",	"parent_name", "name", null));



我用你写的这个工具类调用了下,报空指针异常
--- 共有 1 条评论 ---
糊搞我用得好好的,,,你调试一下,看看是哪里的问题~~~ 3年前 回复
顶部