java如何實(shí)現(xiàn)樹(shù)形查詢
java實(shí)現(xiàn)樹(shù)形查詢
首先這個(gè)樹(shù)形查詢,你肯定不能用他內(nèi)置sql語(yǔ)句吧
這里我自己在dao層寫(xiě)一句sql語(yǔ)句進(jìn)行查詢
@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();這里我寫(xiě)的原生sql語(yǔ)句,不原生的俺也不會(huì)。
接下來(lái)就要實(shí)現(xiàn)樹(shù)形查詢了
service層代碼我就不po出來(lái)了,直接po實(shí)現(xiàn)層的代碼:
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){
//一級(jí)節(jié)點(diǎn)
list.add(menuTreeVO);
}else {
//子節(jié)點(diǎn)
findFather(menuTreeVO,list);
}
}
return list;
}到這里有人就要問(wèn)了,你怎么知道不同子級(jí)對(duì)應(yīng)的父級(jí)是哪個(gè)啊,問(wèn)得好!
在上述方法中有一個(gè)方法是findFather()這個(gè)就是進(jìn)行父級(jí)尋找的方法,數(shù)據(jù)庫(kù)里肯定是有關(guān)系的,
下面看看這個(gè)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);
//判斷是否為對(duì)應(yīng)節(jié)點(diǎn)的子節(jié)點(diǎn)
if (menuvo.getId().equals(menuTreeVO.getPid())){
menuvo.getChildren().add(menuTreeVO);
}
}
return null;
}像我這里表中是有PID和ID的區(qū)別,
子級(jí)的PID和父級(jí)的ID是一樣的,而父級(jí)的PID是空的,所以第一個(gè)判斷使用ID進(jìn)行判斷,
如果ID為空那就是父級(jí),把他取出來(lái)存在一個(gè)List當(dāng)中,你得先聲明空的集合奧,類(lèi)似于漢諾塔那樣。
然后通過(guò)ID和PID的關(guān)系再去找子級(jí),需要說(shuō)的一點(diǎn)是,
我這里用的是域?qū)ο筠D(zhuǎn)換,自己封裝了一下,這個(gè)VO中有這么一個(gè)元素:
private List<MenuTreeVO> children = new ArrayList<>();
我只能說(shuō)DDDD,這就是用來(lái)存子級(jí)的list對(duì)象。
大概差不多就是這個(gè)意思,自己理解一下就行。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Jenkins自動(dòng)化部署SpringBoot項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了Jenkins自動(dòng)化部署SpringBoot項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-01-01
java編程調(diào)用存儲(chǔ)過(guò)程中得到新增記錄id號(hào)的實(shí)現(xiàn)方法
這篇文章主要介紹了java編程調(diào)用存儲(chǔ)過(guò)程中得到新增記錄id號(hào)的實(shí)現(xiàn)方法,涉及Java數(shù)據(jù)庫(kù)操作中存儲(chǔ)過(guò)程的相關(guān)使用技巧,需要的朋友可以參考下2015-10-10
通過(guò)代理類(lèi)實(shí)現(xiàn)java連接數(shù)據(jù)庫(kù)(使用dao層操作數(shù)據(jù))實(shí)例分享
Java正則表達(dá)式驗(yàn)證固定電話號(hào)碼符合性
使用Java8中Optional機(jī)制的正確姿勢(shì)
Spring Boot2中如何優(yōu)雅地個(gè)性化定制Jackson實(shí)現(xiàn)示例

