Mybatis一对多分页插件或limit语句查询不准确——缺少数据

在构建一个一对多关系的考试系统时,遇到分页查询问题。原SQL查询导致选项被错误地分页,每个题目只显示部分选项。通过分析,发现分页插件按最终结果进行limit操作,而非仅对题目表进行限制。为解决此问题,采用子查询方式修改SQL,确保题目表先进行分页,再与选项表连接。最终实现正确查询每个题目及其所有选项。
摘要由CSDN通过智能技术生成

前提描述

最近想做一个考试系统,题目和选项是一对多的关系
题目表和选项表
因为题目后续可能会越来越多,故想引入分页插件pagehelper来减轻查询压力
在做映射时,将选项放到了题目的实体类中

public class Item {
    /**试题ID*/
    private Integer id;
    /**试题类型*/
    private Integer itemType;
    /**题目内容*/
    private String content;
    /**配图路径*/
    private String image;
    /**是否为正确解答,1是2否*/
    private int solution;
    /**选项*/
    private List<Option> options;
}

public class Option {
    /**选项ID*/
    private int id;
    /**选项内容*/
    private String content;
    /**是否为正确答案,1是2否*/
    private int solution;
    /**所属题目ID*/
    private int itemId;
}

题目表
题目表
选项表
选项表

问题出现

查询所有题目:

SELECT * FROM item_bank t1 
LEFT JOIN option_bank t2 ON t1.id = t2.item_id

查询所有题目的结果
当使用分页插件进行查询第一页,每页两条数据时,却查到了这个结果:
分页插件查询结果
我想要的是题目表中的两条数据,然后关联后面的多个选项
但分页插件却将关联的选项也作为了一条数据,导致,第一个题只有两个选项

问题原因

分页插件原理就是拼接limit语句
当你用select查询出结果后,因为是一对多,它会以最终结果去limit拆分
而我们想要的是通过题目表(一方表)去limit,选项表(多方表)不应该参与limit

问题解决

可以做子查询、动态SQL、查询两次等方式
我采用了直接在SQL上动手脚 ^ - ^

-- 原SQL
SELECT t1.*, t2.* FROM item_bank t1 
LEFT JOIN option_bank t2 ON t1.id = t2.item_id
LIMIT 0,2

-- 改完之后
SELECT * FROM (
 SELECT * FROM item_bank t1 LIMIT 0, 2 
) t2 LEFT JOIN option_bank t3 ON t2.id = t3.item_id 

dao层映射文件:
startNo是通过page计算出来的,表示数据开始位置

<select id="getItems" resultMap="item">
    select * from (
    select * from item_bank t1
    <!-- 分页 -->
    <if test="startNo != null and size != null">
        limit #{startNo}, #{size}
    </if>
    ) t2
    left join option_bank t3 on t2.id = t3.item_id
</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值