马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
二级品评列表是很常见的功能,文章记录了新手用Java实现的具体逻辑。
团体实现逻辑是先用2个sql,分别查出两层数据。然后用java在service中实现数据组装,返给前端。这种实现思路好处是SQL简洁,逻辑分明,便于维护。
一:需求场景
一级品评的列表,平铺展示。当涉及多人复兴,或者两个人多次对话后, 留言逻辑看着非常紊乱。如下图
当改造为二级列表后,数据展示更加直观。如下图, 演示所在:CodingLife
二、SQL实现
先用2个SQL分别查出两层数据,先查parent_id为空的数据,就是第一层数据。
再用MyBatis的嵌套查询,设置in语句查出全部的二级数据。
- # 一级评论
- <select id="getuserSideLevel1" resultMap="indexResultMap">
- select
- *
- from
- leave_message ml
- left join user user
- on user.id = ml.leave_id
- where
- parent_id is null
- order by
- create_time desc
- limit #{start},#{size}
- </select>
- # 二级评论
- <select id="getuserSideLevel2" resultMap="indexResultMap">
- select
- *
- from
- leave_message ml
- left join user user
- on user.id = ml.leave_id
- where
- parent_id in
- <foreach collection="parentIds" item="parentId" open="(" separator="," close=")">
- #{parentId}
- </foreach>
- order by
- create_time asc
- </select>
复制代码 三、Java组装
使用Java将两级数据组装在一起,下面为service的具体代码。
- // 先查分页范围内的一级数据
- List<LeaveMessage> level1List = leaveMessageMapper.getuserSideLevel1(start,size);
- // 取出一级数据的id
- List<Integer> parentIdArray = new ArrayList<>();
- for (int i = 0; i < level1List.size(); i++) {
- LeaveMessage level1Item = level1List.get(i);
- Integer id = level1Item.getId(); // 获取 id
- parentIdArray.add(id);
- }
- // 再查以上一级数据的二级数据
- List<LeaveMessage> level2List = leaveMessageMapper.getuserSideLevel2(parentIdArray);
- // 组装如上两级数据
- for (int i = 0; i < level1List.size(); i++) {
- LeaveMessage level1Item = level1List.get(i);
- List<LeaveMessage> childList = new ArrayList<>();
- for (int j = 0; j < level2List.size(); j++) {
- LeaveMessage child = level2List.get(j);
- if (level1Item.getId().equals(child.getParentId())) {
- childList.add(child);
- }
- }
- level1Item.setChild(childList);
- }
- return ApiResponse.success(level1List);
复制代码 四、源码
演示所在为:CodingLife,源码所在为:Git
|