1.在显示部门时因为存在上下级的关系所有在显示时要进行一定的缩进如图:
2.用递归遍历部门树
2.1因为一个上级部门对应多个子级部门,子级部门下面又有子级部门,这时候我们可以把部门看成一颗颗的树,把每个*部门(没有上级的部门)看成顶点,每个子级部门作为节点,每个子级部门又是其他子级部门的顶点。
2.2所以我们遍历树的时候只要遍历树的顶点和子节点就行了,然后把子节点作为顶点传入方法递归遍历这样就遍历完了。
3.代码
3.1获取所有*部门和子部门的代码
@Override public List<Department> getTop() { //当没有父级部门时为*部门 List<Department> list = getSession().createQuery ("FROM Department where parentId is null") .list(); return list; } /** * 查询子部门 * @return */ @Override public List<Department> getChild(Long parentId) { List<Department> list = getSession().createQuery ("FROM Department where parentId=?") .setParameter(0, parentId) .list(); return list; }3.2递归获取每颗部门树
/** * 遍历部门树,把所有的部门遍历出来修改名字,以层次显示 * @param topDepartmentList 所有的*部门(也就是所有的顶点) * @return */ public static List<Department> getAllDepartment(List<Department> topDepartmentList) { //用于接收遍历否的部门集合 List<Department> list=new ArrayList<Department>(); //依次遍历每个顶点 getDepartmentTree(topDepartmentList,"†",list); return list; } /** * 遍历部门树 * @param departmentList */ public static List<Department> getDepartmentTree(Collection<Department> departmentList,String prefix,List<Department> list){ //传入top部门 for (Department department : departmentList) { //获取topDepartment的属性 Department copy=new Department(); copy.setName(prefix+department.getName()); copy.setId(department.getId()); //用于接收列表显示的部门 list.add(copy); //递归显示子部门 getDepartmentTree(department.getChildren()," "+prefix,list); } return list; }4注意点
(1)因为我们要在前端页面显示空格,所以这里的空格要用全角。
(2)由于我们不想改变Department.name最终在数据库的属性所以我们这里要用一个copy后的DepartmentList去接收显示在前台界面。
因为如果更改这个获取的树有可能在后面的Service中提交事务从而更改了数据库。
(3)由于Department.children的属性是set集合所以在前台显示时可能会无序可以再和hibernate配置中添加属性如下:
<!-- children属性本类与Department(下级)一对多的 --> <set name="children" cascade="delete" order-by="id ASC"> <key column="parentId"></key> <one-to-many class="Department"/> </set>