数据为一对多分页查询数据错乱

记录一下经常遇到的问题:列表分页查询,数据是一对多的形式

三种实现方式
1、Service层实现
2、不使用分页插件,子查询
3、使用mybatis的懒加载

示例为一篇文章关联多个附件,代码中的部分简单业务逻辑已删除

1. Mapper接口

@Mapper
public interface ArticleMapper {
    
    // ========== 方案一:Service层实现 ==========
    
    // 查询文章列表(不关联文件)
    List<Article> selectArticleList(@Param("dto") ArticleQueryDto dto, 
                                   @Param("offset") Integer offset, 
                                   @Param("limit") Integer limit);
    
    // 查询文章总数
    int selectArticleCount(@Param("dto") ArticleQueryDto dto);
    
    // 根据文章ID列表查询文件
    List<FileInfoDto> selectFilesByArticleIds(@Param("articleIds") List<Long> articleIds);
    
    // 检查用户是否点赞
    boolean checkUserLiked(@Param("userId") String userId, @Param("articleId") Long articleId);
    
    // ========== 方案二:子查询 ==========
    
    // 子查询方式查询文章列表
    List<ArticleInfoVo> selectListWithSubquery(@Param("dto") ArticleQueryDto dto,
                                              @Param("userId") String userId,
                                              @Param("offset") Integer offset,
                                              @Param("limit") Integer limit);
    
    // 子查询方式查询总数
    int selectCountWithSubquery(@Param("dto") ArticleQueryDto dto);
    
    // ========== 方案三:使用select属性进行懒加载 ==========
    
    // 使用select属性进行懒加载,也可以使用分页插件进行处理
    List<ArticleInfoVo> selectListWithSelect(@Param("dto") ArticleQueryDto dto,
                                                @Param("userId") String userId);
}

2. Mapper XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.ArticleMapper">

    <resultMap id="ArticleWithFileMap" type="com.example.vo.ArticleInfoVo">
        <id column="id"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J_novice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值