java如何实现树形查询
作者:安达鲁狗
这篇文章主要介绍了java实现树形查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
java实现树形查询
首先这个树形查询,你肯定不能用他内置sql语句吧
这里我自己在dao层写一句sql语句进行查询
@Query(value = "select * from TB_UIM_MENU_TEST t START WITH t.PID IS NULL" + " CONNECT BY PRIOR t.ID = t.PID order by t.PID NULLS first,t.MENU_SORT ASC",nativeQuery = true) List<MenuTestDTO> findTree();
这里我写的原生sql语句,不原生的俺也不会。
接下来就要实现树形查询了
service层代码我就不po出来了,直接po实现层的代码:
public List findTree() { List<MenuTreeVO> list = new ArrayList<>(); List<MenuTestDTO> dataList = menuTestDAO.findTree(); List<MenuTreeVO> resultList = new ArrayList<>(); for (int i = 0; i < dataList.size(); i++) { MenuTestDTO menuTestDTO = dataList.get(i); MenuTreeVO menuTreeVO = new MenuTreeVO(); menuTreeVO.setId(menuTestDTO.getId()); menuTreeVO.setPid(menuTestDTO.getPid()); menuTreeVO.setLockState(menuTestDTO.getLockState()); menuTreeVO.setLogo(menuTestDTO.getLogo()); menuTreeVO.setMenuSort(menuTestDTO.getMenuSort()); menuTreeVO.setName(menuTestDTO.getName()); menuTreeVO.setRoute(menuTestDTO.getMenuRoute()); resultList.add(menuTreeVO); } for (int i = 0; i < resultList.size(); i++) { MenuTreeVO menuTreeVO = resultList.get(i); if (menuTreeVO.getPid() == null){ //一级节点 list.add(menuTreeVO); }else { //子节点 findFather(menuTreeVO,list); } } return list; }
到这里有人就要问了,你怎么知道不同子级对应的父级是哪个啊,问得好!
在上述方法中有一个方法是findFather()这个就是进行父级寻找的方法,数据库里肯定是有关系的,
下面看看这个findFather()方法
private List findFather(MenuTreeVO private List findFather(MenuTreeVO menuTreeVO,List list){ for (int i = 0; i < list.size(); i++) { MenuTreeVO menuvo = list.get(i); //判断是否为对应节点的子节点 if (menuvo.getId().equals(menuTreeVO.getPid())){ menuvo.getChildren().add(menuTreeVO); } } return null; }
像我这里表中是有PID和ID的区别,
子级的PID和父级的ID是一样的,而父级的PID是空的,所以第一个判断使用ID进行判断,
如果ID为空那就是父级,把他取出来存在一个List当中,你得先声明空的集合奥,类似于汉诺塔那样。
然后通过ID和PID的关系再去找子级,需要说的一点是,
我这里用的是域对象转换,自己封装了一下,这个VO中有这么一个元素:
private List<MenuTreeVO> children = new ArrayList<>();
我只能说DDDD,这就是用来存子级的list对象。
大概差不多就是这个意思,自己理解一下就行。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。