mybatis配合pageHelper一对多查询分页问题处理
时间:2021-08-23
本文章向大家介绍mybatis配合pageHelper一对多查询分页问题处理,主要包括mybatis配合pageHelper一对多查询分页问题处理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用mybatis结合pageHelper实现分页查询,但查询多表的时候数据就会比真实的要少,如下面程序。
需求是:tab_question是题目表,tab_option是选项表,查询一道题目下面4个选项,一页有5个题目。
//controller层
@RestController
@RequestMapping("/question")
public class QuestionController extends BaseController {
@Autowired
private QuestionService questionService;
@GetMapping
public PageInfo findAll(){
PageHelper.startPage(1, 5);
List<Question> questions = questionService.findAll();
PageInfo pageInfo = new PageInfo(questions);
return pageInfo;
}
}
mapper配置
<resultMap id="questionMap" type="question">
<id column="qid" property="qid"/>
<result column="question" property="question"/>
<result column="qtype" property="qtype"/>
<collection property="options" ofType="option" >
<id column="oid" property="oid"/>
<result column="optionDec" property="optionDec"/>
<result column="qid" property="qid"/>
</collection>
</resultMap>
<select id="findAll" resultMap="questionMap">
select * from tab_question q left join tab_option o on q.qid = o.qid
</select>
查询结果,一页只有一个题目,而且第二个题目还不全
{
"total": 36,
"list": [
{
"qid": 1,
"question": "这个问题有几个字",
"qtype": 1,
"options": [
{
"oid": 1,
"optionDec": "1",
"qid": 1
},
{
"oid": 2,
"optionDec": "2",
"qid": 1
},
{
"oid": 3,
"optionDec": "3",
"qid": 1
},
{
"oid": 4,
"optionDec": "8",
"qid": 1
}
]
},
{
"qid": 2,
"question": "大明王朝1566有哪些角色",
"qtype": 2,
"options": [
{
"oid": 5,
"optionDec": "嘉靖",
"qid": 2
}
]
}
]
}
原因是:此时的分页是多表查询后得到的记录再进行分页(相当于按照选项进行分页),但实际要查询的是按照题目进行分页。
解决办法:使用子查询
修改mapper配置,在resultMap中嵌套子查询
<!--此处省略了id,result标签-->
<resultMap id="questionMap" type="question">
<collection property="options" ofType="option" column="qid" select="findOptionById"/>
</resultMap>
<!--主查询-->
<select id="findAll" resultMap="questionMap">
select * from tab_question
</select>
<!--子查询-->
<select id="findOptionById" parameterType="int" resultType="option">
select * from tab_option where qid = #{qid}
</select>
这次结果就对了
{
"total": 9,
"list": [
{
"qid": 0,
"question": "这个问题有几个字",
"qtype": 1,
"options": [
{
"oid": 1,
"optionDec": "1",
"qid": 1
},
{
"oid": 2,
"optionDec": "2",
"qid": 1
},
{
"oid": 3,
"optionDec": "3",
"qid": 1
},
{
"oid": 4,
"optionDec": "8",
"qid": 1
}
]
},
{
"qid": 0,
"question": "大明王朝1566有哪些角色",
"qtype": 2,
"options": [
{
"oid": 5,
"optionDec": "嘉靖",
"qid": 2
},
{
"oid": 6,
"optionDec": "海瑞",
"qid": 2
},
{
"oid": 7,
"optionDec": "张居正",
"qid": 2
},
{
"oid": 8,
"optionDec": "徐阶",
"qid": 2
}
]
},
{
"qid": 0,
"question": "海钢锋叫什么",
"qtype": 1,
"options": [
{
"oid": 10,
"optionDec": "海瑞",
"qid": 26
},
{
"oid": 11,
"optionDec": "海笔架",
"qid": 26
},
{
"oid": 12,
"optionDec": "润莲",
"qid": 26
},
{
"oid": 13,
"optionDec": "白圭",
"qid": 26
}
]
},
{
"qid": 0,
"question": "海钢锋叫什么",
"qtype": 1,
"options": [
{
"oid": 14,
"optionDec": "海瑞",
"qid": 28
},
{
"oid": 15,
"optionDec": "海笔架",
"qid": 28
},
{
"oid": 16,
"optionDec": "润莲",
"qid": 28
},
{
"oid": 17,
"optionDec": "白圭",
"qid": 28
}
]
},
{
"qid": 0,
"question": "海钢锋叫什么",
"qtype": 1,
"options": [
{
"oid": 18,
"optionDec": "海瑞",
"qid": 29
},
{
"oid": 19,
"optionDec": "海笔架",
"qid": 29
},
{
"oid": 20,
"optionDec": "润莲",
"qid": 29
},
{
"oid": 21,
"optionDec": "白圭",
"qid": 29
}
]
}
]
}
原文地址:https://www.cnblogs.com/cunxitou/p/15178005.html
- Linux :MAC 地址克隆方法
- 解决WordPress修改数据库表前缀后无法登陆的问题
- 解决启用WP-Super-Cache后出现的几个问题
- Shell下制作自解压安装包,实现脚本的简单加密
- WordPress(Twenty Ten主题)文章副标题修改教程
- ipvsadm启动报错解决办法,另附ipvsadm详细参数
- Linux:mv 命令的10个实用例子
- Linux优化方法收集与整理
- 常用MySQL语句搜集整理
- ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility
- 分享一个Linux无法创建文件夹,但是目录权限却显示正常的问题和解决
- 桌面白屏(Active故障)修复批处理
- ASM 翻译系列第十三弹:ASM 高级知识 - Forcing the issue
- ASM 翻译系列第十四弹:ASM Internal Rebalancing act
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 学习git这一篇就够了!!!
- 如何在nodejs中实现兄弟进程通信
- Python异常处理
- Python装饰器实现函数动态类型检查
- 如何自动填充SQL语句中的公共字段
- 面试官喜欢问的Java编译期与运行期问题总结全了
- 面试5年25K程序员回答不出来为什么Java的main方法必须是public static void?
- Python装饰器
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的“正确姿势”
- 面试官:说说SpringBoot中Spring容器的启动过程
- Python IO
- Python解析式
- 面试官:Tomcat 的调优怎么做?你的最佳实践有哪些?
- Tomcat源码分析
- lazy-mock ,一个生成后端模拟数据的懒人工具