-
2021-02-12 09:51:27
一、需求
项目里要让用户能够设置所选择教材的章课节,以针对章课节提供相应的题目供用户做题。
设计:用户设置了教材后,首次登录,进行章节设置时。默认为用户选择第一章、第一课、第一节。
思路:用户访问页面,章一栏显示所有章,课一栏显示第一章下所有课程,节一栏显示第一章、第一课下的所有节。然后获取用户当前选择的章课节信息。如果当前用户没有设置过该教材的章课节,就为其设置默认的第一章、第一课、第一节。
数据库设计:此处将章课节所有信息存放到一张表中,可递归查询。最上一级章的parentid是教材的id。故给一个教材id便可以查找到其下所有的章课节信息。
二、解决
已设置的我们这里不讨论,只需要到库中查询对应的章课节即可。
那么对于默认第一章第一课第一节,我们这里使用一个递归函数将查询的结果存放到一个list中
/*** 根据给定的id,查询其下的第一课、第一节(不只适用于章课节三级,如果下面还有级别的目录,也可查
*
* 询出)
*
*@paraml 是教材id
*@paramlist
*@return
*/
public void getSubChapter(long l, Listlist) {
BookChapter c= null;
String sql= "SELECT D.chapter_id chapter_id, D .chapter_name chapter_name, D . LEVELS LEVELS FROM "
+ "( SELECT * FROM mic_study_book_chapter c WHERE c.parent_chapter_id =? ORDER BY c.code ) D WHERE ROWNUM = 1 ";
Object[] params={ l };try{
logger.info(sql.toString().replaceAll("\\?", "{}"), params);
List li = this.getJdbcTemplate().query(sql, params,newBookChapterRowMapper());if(li.size() != 0){
c= li.get(0);if (c != null) {
list.add(c);
getSubChapter(c.getId(), list);//递归查询
}
}
}catch(Exception e) {
logger.error(e.getMessage(),e);
}
}
递归查询的特点:函数方法自己掉用自己,通过某个条件判断跳出最后一个被调用的递归方法。
更多相关内容 -
java递归查询
2021-12-06 21:23:16递归建立数据库的字段要建立pid 既pid是父id 这里的pid要能在id找到 找到就说明当前id的组织是父组织 如果找不到就说明的顶级id 图中的主菜单1就是顶级组织 public Menu getMenuTree() { //先查询顶级目录 ...递归建立数据库的字段要建立pid
既pid是父id
这里的pid要能在id找到 找到就说明当前id的组织是父组织 如果找不到就说明的顶级id 图中的主菜单1就是顶级组织public Menu getMenuTree() { //先查询顶级目录 LambdaQueryWrapper<Menu> menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); menuLambdaQueryWrapper.eq(Menu::getPid, "0"); Menu menusBase = menuMapper.selectOne(menuLambdaQueryWrapper); //查询除了顶级组织以外的组织 LambdaQueryWrapper<Menu> menuLambdaQueryWrapper2 = new LambdaQueryWrapper<>(); menuLambdaQueryWrapper2.ne(Menu::getPid, "0"); List<Menu> menuLNotBase = menuMapper.selectList(menuLambdaQueryWrapper2); List<Menu> menus = iterateMenus(menuLNotBase, menusBase.getId()); menusBase.setMenuChildren(menus); return menusBase; }
反复调用iterateMenus方法 直到循环遍历结束
/** * 多级组织查询方法 * * @param menuVoList 不包含最高层次组织的组织集合 * @param pid 父类id * @return */ public List<Menu> iterateMenus(List<Menu> menuVoList, String pid) { List<Menu> result = new ArrayList<>(); int a =0; for (Menu menu : menuVoList) { //获取菜单的id String menuid = menu.getId(); //获取菜单的父id String parentid = menu.getPid(); if (parentid.equals(pid)) { //递归查询当前子菜单的子菜单 List<Menu> iterateMenu = iterateMenus(menuVoList, menuid); menu.setMenuChildren(iterateMenu); result.add(menu); } } return result; }
Entity有些字段不需要 我加是因为自己的业务
@Data @NoArgsConstructor @TableName("Menu") public class Menu { private String id; private String name; private String pid; @TableField(exist = false) private List<Menu> menuChildren; @TableField(exist = false) private Boolean nextRank; }
-
java 递归查询多级菜单
2022-04-01 10:27:55} //递归实现查询多级类目 public ExamCategory fillMenuNode(ExamCategory examCategory) { ExamCategory examCategorySearch = new ExamCategory(); examCategorySearch.setParentId( examCategory.getCategoryId...类目表是多级目录表,数据如下:
想获取所有数据的多级目录,代码如下:
/** * 获取树形接口的 类目 * * @return */ @Override public List<ExamCategory> selectExamCategoryTreeList() { //1、 获取所有的一级目录 ExamCategory examCategory = new ExamCategory(); examCategory.setParentId( 0 ); List<ExamCategory> examCategoryList = examCategoryDao.selectExamCategoryList( examCategory ); List<ExamCategory> parentList = new ArrayList<>(); for (ExamCategory category : examCategoryList) { if (category.getParentId().intValue() == 0) { parentList.add( category ); } } //获取一级目录下的多级目录 if (parentList != null) { for (ExamCategory category : parentList) { fillMenuNode( category ); } } return parentList; } //递归实现查询多级类目 public ExamCategory fillMenuNode(ExamCategory examCategory) { ExamCategory examCategorySearch = new ExamCategory(); examCategorySearch.setParentId( examCategory.getCategoryId() ); List<ExamCategory> examCategoryList = examCategoryDao.selectExamCategoryList( examCategorySearch ); if (CollectionUtils.isEmpty( examCategoryList )) { return examCategory; } List<ExamCategory> subMenuList = examCategoryList.stream().map( subMenu -> fillMenuNode( subMenu ) ).collect( Collectors.toList() );//递归实现查询多级菜单 examCategory.setChildrenList( subMenuList ); return examCategory; }
-
Java递归查询子节点集合
2021-08-25 11:41:52以前也做过这种递归的,但是太久没做,一上来,竟然差点给自己搞懵了。所以决定记录下来,供自己以后查阅,也希望可以帮到有需要的朋友。直接上代码。 /** * 根据父节点 id查询所有子节点id集合(包括自身id) ...最近项目中遇到了一个普通需求,在根据目录节点id查询的时候,要求连带把该目录下的子节点一起查出。以前也做过这种递归的,但是太久没做,一上来,竟然差点给自己搞懵了。所以决定记录下来,供自己以后查阅,也希望可以帮到有需要的朋友。直接上代码。
/** * 根据父节点 id查询所有子节点id集合(包括自身id) * * @param parentId 父节点id * @param clientId 客户端id * @return List<Long> 子节点id集合(包括自身id) */ @Override public List<Long> getByParentId(Long parentId, Long clientId) { //查询出所有目录 List<CatalogueInfo> catalogueInfos = lambdaQuery().eq(CatalogueInfo::getClientId, clientId). eq(CatalogueInfo::getUseFlag, "1").select(CatalogueInfo::getId, CatalogueInfo::getParentId).list(); //根据目录的parentId, id把所有包含子目录的目录分组为map ImmutableListMultimap<Long, Long> catalogueInfoMap = catalogueInfos.stream().collect(ImmutableListMultimap.toImmutableListMultimap (CatalogueInfo::getParentId, CatalogueInfo::getId)); //查询parentId下的所有子目录id List<Long> childIds = catalogueInfoMap.get(parentId); //最终返回的所有符合条件的目录id ArrayList<Long> resultIds = new ArrayList<>(childIds); //将父id添加 resultIds.add(parentId); //递归查询子节点的子节点 reduce(childIds, catalogueInfoMap, resultIds); return resultIds; }
clientId:这个只是我查询所有目录业务中需要用到的参数,具体根据实际需求查出所有即可。
ImmutableListMultimap<Long, Long> catalogueInfoMap = catalogueInfos.stream().collect(ImmutableListMultimap.toImmutableListMultimap
(CatalogueInfo::getParentId, CatalogueInfo::getId));这块代码主要是将所有目录分组,注意,只有当该目录下有子目录时候,会将该目录id作为key,子目录id作为value,这里的value是一个list集合。后面递归的时候,其实就是通过这个分组后的map,递归拿到子目录节点id,就是下方的List<Long> ids = catalogueInfoMap.get(id);
递归方法
/** * 递归查询所有子节点 * * @param childIds 待遍历id集合 * @param catalogueInfoMap 分组map * @param resultIds 满足条件的id集合 */ private void reduce(List<Long> childIds, ImmutableListMultimap<Long, Long> catalogueInfoMap, ArrayList<Long> resultIds) { //递归查询子节点的子节点,将所有的子节点添加到resultIds for (Long id : childIds) { List<Long> ids = catalogueInfoMap.get(id); if (ids.isEmpty()) { continue; } resultIds.addAll(ids); reduce(ids, catalogueInfoMap, resultIds); } }
-
java递归查询目录树结构
2022-01-17 11:31:34@Override public List<SvCatalog> treeSvCatalog(String id) { // 从数据库获取所有,减少数据库压力 List<SvCatalog>... //定义新的list存储查询到的数据 List<SvCatalog> cata -
java 递归查询树形结构
2021-03-06 15:18:57例如区域的省市县联动,中,通过查询省的id,查处这个省下边的所有市以及市下边的县等操作,就可以通过递归算法来查询我使用的框架是ssm,主要是在service层做判断private List getRegionList(String id){List list=... -
Java递归算法遍历部门代码示例
2020-08-28 10:47:38主要介绍了Java递归算法遍历部门代码示例,具有一定借鉴价值,需要的朋友可以参考下。 -
Java 递归查询组织机构树
2020-11-15 15:01:16需求:现有一个A集合(机构id集合),需要利用A集合查询出集合中所有机构的子级机构,层级(不知道一共有多少级),最终返回所有的子级机构(就是返回一个childOrganList,不包括A集合) 文章目录代码实现聊聊递归... -
java树形结构递归查询
2018-09-04 17:24:08* 根据等级查询类目树 * * @param level * @return */ @Override public List<CategoryTreeDTO> queryCategoryTree(Integer level) { //查询当前级别下类目 List<CategoryDO> list = categoryDAO.list... -
Java递归查询某个节点下所有子节点多级信息(递归部门查询,递归树形结构数据查询)
2021-08-11 16:32:02如果我们想要查询某个几点下面所有子节点(多级)数据,此时我们又不知道下面有多少级节点以及节点ID,那么我们就需要使用递归去查询了,当然在数据库中写函数也是可以实现的,下面我们使用Java来实现递归查询树形... -
java 递归查询省市区树形结构
2021-04-08 14:25:16具体代码实现如下: @RequestMapping("getTree") public Map<String, Object> getTree(int id) { Map<String, Object> map = new HashMap<... ChinaCitys province = dao.... //查询出一个省 if (pro -
java递归查询树形菜单(递归中查询)
2019-09-07 23:46:23public List<Map<String, Object>>... //查询出所有的一级菜单[pid=0为一级菜单] List<Menu> treeMenu = menuServiceImpl.selectByPid(0); List<Map<String, Object>... -
java 递归查询用户级所以下级(多层)用户
2019-12-03 14:44:43<select id="selectChildren" parameterType="java.util.Map" resultMap="userIdTree"> SELECT u.id FROM hip.`core_user` u WHERE u.`PARENT_ID` =#{id} AND (SELECT COUNT(1) FROM core_channel c WHERE ... -
Java 递归查询部门树形结构数据
2019-05-21 00:24:48说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1、数据库表:department ... * 递归查询部门 ...到这里,递归查询部门树形结构数据就完成了 -
递归实现字符串模糊匹配.java
2020-12-26 08:44:27使用递归实现,字符串模糊匹配,看设置允许匹配错误数。 -
java 递归查询部门,子部门及下属用户列表
2020-01-15 11:59:11//查询当前人 List<User> users = userDao.selectByDepartmentId(department.getId()); departmentResp.setUserList(users); list.add(departmentResp); }); } String s = JSONObject.toJSONString(list); ... -
java递归查询数据库树
2018-08-21 21:56:31先查询第一层的数据,然后调用递归循环第一层的数据,查询父Id等于第一层的Id,执行完成后第一层一下的所有数据就全部查询出来了。。。 场景描述 :每个应用(最顶层,树的根) 下面是多级菜单 每个菜单下是多个... -
Java 递归查询树形结构
2021-12-06 17:17:22Java 递归查询树形结构 -
java 递归查询某个父节点下的所有叶子节点
2018-03-12 14:43:59id name parent_id 1 qq null 2 qqw null 3 www null 4 www 1 5 wwwf 1 6 dsf 1 7 asdfasf 1 8 dasfdasf 2 9 df 2 10 dfd ... -
JAVA递归查询与反向递归(菜单层级显示)
2018-10-11 14:59:41查询子级菜单递归查询具体实现方法1(JAVA8): public void getTreeCategory() { //查询所有的分类 List<VipGoodsCategory> vipGoodsCategoryList = vipGoodsCategoryService.... -
Java递归查询菜单树所有节点-返回单层列表
2019-03-18 16:34:13Java递归方法 /** * * @param pid 父菜单ID * @return */ public List<WsMenu> selectOneList(Integer pid) { //fList是递归查询条件 List<Integer> fL... -
Java之递归求和的两种简单方法(推荐)
2020-09-01 15:22:51下面小编就为大家带来一篇Java之递归求和的两种简单方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
java递归查询数据库数据
2018-03-22 14:52:55先查询第一层的数据,然后调用递归循环第一层的数据,查询父Id等于第一层的Id,执行完成后第一层一下的所有数据就全部查询出来了。。。public List<Information> getTreeList(Integer topId) { ... -
java递归查询分类及分类下所有子分类
2017-08-26 20:09:24该案例是实际开发中运用,java递归查询分类及分类下所有子分类。代码走起:1.jsp页面布局样式这里不再介绍,js业务逻辑展示分类树形结构如下:/** * 商品分类操作 */ /** * 初始化 */ $(function(){ //加载树 ... -
java递归查询菜单层级
2020-01-16 20:49:44说到菜单,大家都知道父菜单下面有子菜单,子菜单下面还有子菜单,那么如何实现这个递归获取菜单呢? public List<ClassificationVo> findAllClassification() { //查询所有菜单 List<ClassificationVo... -
Java递归算法
2020-12-22 17:40:01Java递归算法是基于Java语言实现的递归算法。 递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。 ... -
java递归查询公司下所有部门及子部门
2016-11-25 19:58:34查询公司下所有子部门及子部门: 原型: 1.创建公司和部门实体: CompanyVos: package com.suwei.sysMng.vo; import java.io.Serializable; import java.util.List; public class CompanyVos implements ... -
java 递归查询树形菜单结构(个人认为是最简单的)
2018-10-23 12:54:59/** * 获取无限级的类别资源 */ @Override public List<Object> findTypeTree() ... getChildren()方法传入一级类别的id 作为父id查询出其子类别,然后递归掉用getChildren()方法 实现树形菜单结构树 -
java递归查询算法。。。
2015-07-16 08:33:38有个级联菜单 1-- ---1-1 ------1-1-1 2--- 2---1 -------2-1-1 我要模糊查询“1”关键字 我要把带“1”的全部查出来,如果是二级菜单要把一级...我要把我想要的结果放在一个map或者list中 这个【递归】该怎么写。