栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

前提描述

最近想做一个考试系统,题目和选项是一对多的关系

因为题目后续可能会越来越多,故想引入分页插件pagehelper来减轻查询压力
在做映射时,将选项放到了题目的实体类中

public class Item {
    
    private Integer id;
    
    private Integer itemType;
    
    private String content;
    
    private String image;
    
    private int solution;
    
    private List

题目表

选项表

问题出现

查询所有题目:

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 * from (
    select * from item_bank t1
    
    
        limit #{startNo}, #{size}
    
    ) t2
    left join option_bank t3 on t2.id = t3.item_id

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号