二级品评列表-Java实现

[复制链接]
发表于 2025-9-22 23:00:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
二级品评列表是很常见的功能,文章记录了新手用Java实现的具体逻辑。
团体实现逻辑是先用2个sql,分别查出两层数据。然后用java在service中实现数据组装,返给前端。这种实现思路好处是SQL简洁,逻辑分明,便于维护。
一:需求场景

一级品评的列表,平铺展示。当涉及多人复兴,或者两个人多次对话后, 留言逻辑看着非常紊乱。如下图

当改造为二级列表后,数据展示更加直观。如下图, 演示所在:CodingLife 

二、SQL实现

先用2个SQL分别查出两层数据,先查parent_id为空的数据,就是第一层数据。
再用MyBatis的嵌套查询,设置in语句查出全部的二级数据。
  1.     # 一级评论
  2.     <select id="getuserSideLevel1" resultMap="indexResultMap">
  3.         select
  4.             *
  5.         from
  6.             leave_message ml
  7.         left join user user
  8.             on user.id = ml.leave_id
  9.         where
  10.             parent_id is null
  11.         order by
  12.             create_time desc
  13.         limit #{start},#{size}
  14.     </select>
  15.     # 二级评论
  16.     <select id="getuserSideLevel2" resultMap="indexResultMap">
  17.         select
  18.             *
  19.         from
  20.             leave_message ml
  21.                 left join user user
  22.         on user.id = ml.leave_id
  23.         where
  24.             parent_id in
  25.         <foreach collection="parentIds" item="parentId" open="(" separator="," close=")">
  26.             #{parentId}
  27.         </foreach>
  28.         order by
  29.             create_time asc
  30.     </select>
复制代码
三、Java组装

使用Java将两级数据组装在一起,下面为service的具体代码。
  1.         // 先查分页范围内的一级数据
  2.         List<LeaveMessage> level1List = leaveMessageMapper.getuserSideLevel1(start,size);
  3.         // 取出一级数据的id
  4.         List<Integer> parentIdArray = new ArrayList<>();
  5.         for (int i = 0; i < level1List.size(); i++) {
  6.             LeaveMessage level1Item = level1List.get(i);
  7.             Integer id = level1Item.getId(); // 获取 id
  8.             parentIdArray.add(id);
  9.         }
  10.         // 再查以上一级数据的二级数据
  11.         List<LeaveMessage> level2List = leaveMessageMapper.getuserSideLevel2(parentIdArray);
  12.         // 组装如上两级数据
  13.         for (int i = 0; i < level1List.size(); i++) {
  14.             LeaveMessage level1Item = level1List.get(i);
  15.             List<LeaveMessage> childList = new ArrayList<>();
  16.             for (int j = 0; j < level2List.size(); j++) {
  17.                 LeaveMessage child = level2List.get(j);
  18.                 if (level1Item.getId().equals(child.getParentId())) {
  19.                     childList.add(child);
  20.                 }
  21.             }
  22.             level1Item.setChild(childList);
  23.         }
  24.         return ApiResponse.success(level1List);
复制代码
四、源码

演示所在为:CodingLife,源码所在为:Git

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表