问题描述

​ 通常我们我们在单表查询中我们可以采用limit进行分页查询,这样可以减少页面的显示量,加快页面想应速度。但是在MyBatis框架中,如果我们在一对多或多对多查询中直接使用limit关键字的话会产生查询结果数量不够的情况

我们先给出一个关系模型:

​ blog_tag(标签表)和blog_article(文章表)是多对多关系,article_tag是多对多关系中的联系表。

传统的分页查询

​ 我们需要分页查询blog_article表,然后关联查询“文章的标签”表,执行SQL如下:

-- 只查询表中一小部分字段是为了演示方便,我们分页article表的8条数据
SELECT
a.id,
a.title,
t.tagname,
t.article_num
FROM
blog_article a
LEFT JOIN article_tag a_t ON a.id = a_t.article_id
LEFT JOIN blog_tag t ON a_t.tag_id = t.id
LIMIT 0,8

查询结果:

​ 我们可以看到查询的结果中虽然有8条数据,但是不是我们想要的8条article数据,如果上述结果被MyBatis封装只会得到4个BlogArticle对象。这就开头提出的问题的产生原因。

解决方案

​ 我们可以采用子查询分页的方式来解决这个问题。

SELECT
a.id,
a.title,
t.tagname,
t.article_num
FROM
(select id,title from blog_article limit 0,8) a
LEFT JOIN article_tag a_t ON a.id = a_t.article_id
LEFT JOIN blog_tag t ON a_t.tag_id = t.id

执行结果:


​ 通过上述方案,我们才能得到8条BlogArticle对象。

MyBatis一对多或多对多分页查询的结果条数不符合预期的问题解决的更多相关文章

  1. MyBatis 一对多,多对一关联查询的时候Mapper的顺序

    要先写association,然后写collection:这是由DTD决定的: <resultMap ...> <association ...> </associati ...

  2. Mybatis一对多或多对多只能查出一条数据解决策略

    原文:https://blog.csdn.net/ren814/article/details/81742242 <resultMap id="menuModelMap" t ...

  3. mybatis报错:查询一对多或多对多时只返回一条数据的问题

    问题: 使用映射文件实现查询一对多或多对多时只返回一条数据问题 解决方法: 导致这种情况出现的问题是因为两个表中的主键是一样所以出现了数据覆盖问题. 解决方式一:修改数据库表中的主键(这种方法比较麻烦 ...

  4. SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份

    SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...

  5. Mybatis一对多/多对多查询时只查出了一条数据

    问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...

  6. springboot结合mybatis使用pageHelper插件进行分页查询

    1.pom相关依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  7. Mybatis的ResultMap与limit分页查询

    ResultMap主要解决的是:属性名和字段不一致 如果在pojo中设置的是一个名字,在数据库上又是另一个名字,那么查询出来的结果或者其他操作的结果就为null. //在pojo中 private S ...

  8. mybatis一对多根据条件查询的查条数

    一对多写了mapper映射之后 根据条件查条数 可以根据主表的唯一id进行分组 在拿到它的count select count(0) over(aa.id),,id,name,age from tab ...

  9. C# 返回分页查询的总页数

    /// <summary> /// 返回分页查询操作的的总页数 /// </summary> /// <param name="count">总 ...

  10. 表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数

    上一篇笔记将开始定义的存储结构处理了一下,将FormItems数组中的表单项都拿到mongodb document的最外层,和以前的关系型数据类似,之不过好多列都是动态的,不固定,不过这并没有什么影响 ...

随机推荐

  1. VS 在 Release 模式下使用断点调试程序

    修改方法: 项目属性 --> c/c++ --> 常规 --> 调试信息格式 选择程序数据库 (默认:无) 项目属性 --> c/c++ --> 优化 --> 优化 ...

  2. Bash下切换conda环境

    背景:很多时候实验命令都是基于Linux系统的,但是很多人的电脑是window系统的. 使用git自带的Bash可以运行linux命令,不过有时候在bash中想使用conda环境的时候比较麻烦,具体做 ...

  3. c# 历史版本特性

    版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...

  4. Fatal: (vsim-3381) obsolete library format 解决办法

    有很多软件仿真都是black boxs 黑盒子模式,所以用modelsim提示该错误.错误的原因是在于库用了其他旧的软件版本编译好的. 所以解决的办法如下: 在已经映射好的库选择refresh就可以刷 ...

  5. dom4j 通用解析器,解析成List<Map<String,Object>>

    import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.u ...

  6. 力扣977(Java)-有序数组的平方(简单)

    题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1,0,3,10]输出:[0,1, ...

  7. 力扣396(java)-旋转数组(中等)

    题目: 给定一个长度为 n 的整数数组 nums . 假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数  F 为: F(k) = 0 * arrk[0 ...

  8. 力扣521(java&python)-最长特殊序列Ⅰ(简单)

    题目: 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列  的长度.如果不存在,则返回 -1 . 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的 ...

  9. Pandas+ SLS SQL:融合灵活性和高性能的数据透视

    简介: Pandas是一个十分强大的python数据分析工具,也是各种数据建模的标准工具.Pandas擅长处理数字型数据和时间序列数据.Pandas的第一大优势在于,封装了一些复杂的代码实现过程,只需 ...

  10. [TP5] 动态绑定指定默认模块, 解决: 控制器不存在:app\index\controller\Api

    当在 TP5 入口中简单使用 define('BIND_MODULE','index') 绑定默认模块后,访问 api 模块会提示: 控制器不存在:app\index\controller\Api 这 ...