【Java】树结构SQL数据的如何去实现搜索

这篇具有很好参考价值的文章主要介绍了【Java】树结构SQL数据的如何去实现搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需要实现的效果

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言

前端需要的json格式:一定是一个完整的树结构

错误

错误的返回格式

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言

错误的返回格式实现的效果

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言

正确

正确的返回格式

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言

正确的展示画面

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言

后端

逻辑分析

1. 根据搜索条件,查出符合的数据

List<ReproductiveCycleInfo> list = reproductiveCycleInfoMapper.selectReproductiveCycleInfoList(reproductiveCycleInfo);

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言
这一步不能直接返回给前端的,因为前端的组件是需要完整的一个树结构。
从图中可以看到,我们 id in(70,71,72)的父节点 id = 17 没有找到,所以 这就不是一个完整的树结构。

2. 符合的数据里面我们需要发现还需要找到几个父节点数据

// parentId = 0,表示他已经没有父节点了
Set<Long> collect = list.stream().filter(x -> x.getParentId() != 0).map(ReproductiveCycleInfo::getParentId).collect(Collectors.toSet());

【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言
3. 开始找父节点的信息

        if (StringUtils.isNotEmpty(collect)) {
            for (Long x : collect) {
                getParentInfoByParentId(x, list);
            }
        }

3.1 根据节点的id找到节点

    /**
     * 根据节点id找出节点,并添加到结果集里面
     *
     * @param nodeId 当前需要找的节点id
     * @param list 返回的结果集
     */
    private void getNodeByParentId(Long nodeId, List<ReproductiveCycleInfo> list) {
        // 1. 如果当前需要找的节点
        if (nodeId != 0) {
            // 2. 为了避免父节点也已经出现在 所有的节点信息 里面
            // 2.1 找出当前所有的节点信息
            List<Long> ids = list.stream().map(ReproductiveCycleInfo::getId).collect(Collectors.toList());
            // 2.2 当前所有的节点信息不包含当前需要找的节点
            if (!ids.contains(nodeId)) {
                // 3. 从数据库里面,根据父节点的id,找到父节点信息
                ReproductiveCycleInfo one = reproductiveCycleInfoMapper.selectReproductiveCycleInfoById(nodeId);
                // 4. 把当前节点放到所有节点里面
                list.add(one);
                // 5. 如果当前节点还存在父节点
                if (one.getParentId() != 0) {
                    // 6. 递归去找父节点信息
                    getNodeByParentId(one.getParentId(), list);
                }
            }
        }
    }

以找17节点为例子:
【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言

代码总览

从这里也可以看出我这里其实代码已经有逻辑耦合了。毕竟 node != 0 判断了两次了,这其实没必要。还可以优化一下。

    @Override
    public List<ReproductiveCycleInfo> selectReproductiveCycleInfoListByName(ReproductiveCycleInfoDto reproductiveCycleInfo) {
        List<ReproductiveCycleInfo> list = reproductiveCycleInfoMapper.selectReproductiveCycleInfoList(reproductiveCycleInfo);
        Set<Long> collect = list.stream().filter(x -> x.getParentId() != 0).map(ReproductiveCycleInfo::getParentId).collect(Collectors.toSet());
        if (StringUtils.isNotEmpty(collect)) {
            for (Long x : collect) {
                getNodeByParentId(x, list);
            }
        }
        return list;
    }

    /**
     * 根据节点id找出节点,并添加到结果集里面
     *
     * @param nodeId 当前需要找的节点id
     * @param list 返回的结果集
     */
    private void getNodeByParentId(Long nodeId, List<ReproductiveCycleInfo> list) {
        // 1. 如果当前需要找的节点
        if (nodeId != 0) {
            // 2. 为了避免父节点也已经出现在 所有的节点信息 里面
            // 2.1 找出当前所有的节点信息
            List<Long> ids = list.stream().map(ReproductiveCycleInfo::getId).collect(Collectors.toList());
            // 2.2 当前所有的节点信息不包含当前需要找的节点
            if (!ids.contains(nodeId)) {
                // 3. 从数据库里面,根据父节点的id,找到父节点信息
                ReproductiveCycleInfo one = reproductiveCycleInfoMapper.selectReproductiveCycleInfoById(nodeId);
                // 4. 把当前节点放到所有节点里面
                list.add(one);
                // 5. 如果当前节点还存在父节点
                if (one.getParentId() != 0) {
                    // 6. 递归去找父节点信息
                    getNodeByParentId(one.getParentId(), list);
                }
            }
        }
    }

数据库表结构

起码得满足有这些极端并约定 parentId = 0 是表示是首节点了.
【Java】树结构SQL数据的如何去实现搜索,零碎笔记,java,开发语言文章来源地址https://www.toymoban.com/news/detail-682262.html

到了这里,关于【Java】树结构SQL数据的如何去实现搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构中一些零碎且易忘的知识点

    第一章 绪论 数据结构包含三个方面的内容: 数据的逻辑结构:描述数据之间逻辑关系的、与数据的存储无关的数学模型。相同的逻辑结构可使用不同的存储结构存储,如线性表既可顺序存储,也可链式存储 线性结构:一个线性表是n个具有相同特性的数据元素的有限序列 一

    2024年02月14日
    浏览(41)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(53)
  • 数据结构与算法之美学习笔记:48 | B+树:MySQL数据库索引是如何实现的?

    本节课程思维导图: 作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库

    2024年01月16日
    浏览(82)
  • SQL笔记 -- 数据库结构优化

    不常用的数据为冷数据,反之则为热数据。如果一个表中的数据存在明显的使用频率差异,那么可以将冷热数据分离。通过这种分解可以提高表的查询效率。对于字段很多且有些字段使用不频繁的表,可以通过这种分解的方式来优化数据库的性能。 例如: 会员members表存储会

    2024年01月22日
    浏览(59)
  • 数据结构之美:如何优化搜索和排序算法

    🎉欢迎来到数据结构学习专栏~数据结构之美:如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水

    2024年02月08日
    浏览(55)
  • Java数据结构与算法:二叉搜索树

    Java数据结构与算法:二叉搜索树 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在计算机科学中,二叉搜索树(Binary Search Tree,简称BST)是一种常见的树形数据结构,它具有良好的查找和插入性能。每

    2024年01月24日
    浏览(45)
  • 二分搜索树(校招数据结构最低要求版)Java

    二分搜索树(Binary Search Tree,BST)是一种常见的数据结构,它能够高效地存储和查找数据。它的特点是每个节点都包含一个值,并且每个节点的左子树的值都小于节点的值,右子树的值都大于节点的值。 通过这种有序的排列方式,我们可以在二分搜索树中进行高效的查找操作

    2024年02月10日
    浏览(45)
  • 【数据结构】 二叉搜索树的实现

    二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 比如以下就为一个人二叉搜

    2024年02月09日
    浏览(37)
  • 数据结构:二叉搜索树(非递归实现)

    目录 1、二叉搜索树 2、二叉搜索树的相关操作。 1、查找 2、插入 3、删除 3、代码实现(非递归) 二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,小于其右子树中所有节点的值。这种特性使得二叉搜索树具有快速

    2024年03月08日
    浏览(38)
  • 【数据结构】搜索二叉树(C++实现)

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【C++】C++模板进阶 —— 非类型模板参数、模板的特化以及模板的分离编译 二叉搜索树又称二叉排序树,它或者是一棵空

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包