后台有个接口是根据create_time字段排序查询列表。
结果发现翻页到第二页,出现了一条和第一页某条数据一模一样的数据。
怀疑可能是order by create_time导致排序不稳定。所以决定多加一个根据id排序
增加根据id排序后,解决了该问题。
orderBy 排序的createTime字段不唯一,会出现数据排序不稳定,以至于limit分页时出现数据重复。
需要加上唯一列,如:id,保证orderBy的排序的唯一性,可以解决limit分页时出现数据重复的问题。
orderBy 排序的createTime字段不唯一,会出现数据排序不稳定,以至于limit分页时出现数据重复。需要加上唯一列,如:id,保证orderBy的排序的唯一性,可以解决limit分页时出现数据重复的问题。
Mybaitsplus 条件查询+
排序
+
分页
//创建QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//条件查询
queryWrapper.eq("apply_id", applyId);
queryWrapper.eq("del_status", 0);
//构建
分页
对象 【第一个参数是当前页数,第二个参数的每页条数】
之前写了一个
分页
查询用
mybatis
plus的
分页
查询,根据按照时间倒序
排序
。前端说有
重复
数据
orderBy
排序
的字段不唯一,会出现
数据
排序
不稳定,以至于limit
分页
时出现
数据
重复
。
需要加上唯一列,如:id,保证orderBy的
排序
的唯一性,可以解决limit
分页
时出现
数据
重复
的问题。...
1. 问题描述
bug发生在一个即将下班的周五,产品经理发来了钉钉消息,一个线上跑了很久的系统,用户列表上下翻页的时候有两条一模一样的
数据
。当时我的第一反应是不可能啊,这系统都跑多久了,最近也没人改代码,怎么会有问题呢。不过产品经理说有bug,咱也不能忽视对吧,有bug那就看看呗,争取周五早点下班。
2. 问题重现及解决(模拟的线上环境)
2.1 环境
mysql 8.0 、pageHelper
分页
插件
2.2 问题现象
两次结果出现同一条 id 为 53的
数据
截图如下:
2.3 问题分析
查看sql
@Bean
public PaginationInterceptor paginationInterceptor() {
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
正常使用PageHelper来
分页
时可以的,但是如果在查询list后做了非常多的处理,即解包在装包操作。可能最后返回时
分页
的
数据
查询的对,但是
分页
信息就有问题了。有的甚至
分页
功能都不行。这里为避免几个坑,有些规则遵守还是有必要的。
1.首先将下面这句代码放在第一行。
PageHelper.startPage(pageNum, pageSize);
2.查询出list后,通过下面语句获取总条数。这个不是这一页的总条数,而是不
分页
情况下查询的总条数。
PageInfo<实体类> page
WITH selectTemp AS (
SELECT
TOP 100 PERCENT ROW_NUMBER ( ) OVER ( ORDER BY
排序
字段) AS __row_number__,
WHERE
1 = 1
ORDER ...
原因分析:
原因是一对多经过
mybatis
结果映射之后就会整理
重复
数据
,因为我们
分页
是按主表的
数据
来分的,这里查出来的20条
数据
也有从表的
数据
,所以他本来就是不够20条的。
解决方案:
既然如此,那我就用group by 让你按主表记录数显示,然后再用
mybatis
“n+1”的查询方式,再给你填充
数据
,这样就完美的解决了这个问题。
<!-- 通用查询映射结果 --&
其实两者联合使用非常简单,只需要在使用
分页
插件的基础上使用其提供的orderByDesc/orderByAsc就能完美融合。写这篇博客只是给一些初学者一个方便的整理而已。下面会先给出完整的使用情况,在到后面分别解释两者的用法。以方便只关心这个用法或者赶时间的朋友。处于保密性考虑,我将大部分字段进行了删减,将项目名也进行了修改
Controller
@Slf4j
@Validated
@Res...
1
mybatis-plus
select查询语句默认是查全部字段,有两种方法可以指定要查询的字段
2
Mybatis
plus实现Distinct去重功能
3
Mybatis
plus实现in操作
4
mybatis
转义对照表
2. 解决思路
既然是在我
分页
的过程中,插入了一条记录,导致我再查询下一页的时候,查出来上一页的记录,那么,我思考,我可不可以不去查询他新增的这一条记录。那么这样,就查询不到别人新增的这条记录了。
那么需要的条件就出来了:
数据
库表要有创建时间的这么一个字段
那么解决思路就出来了,首先是要前端进行配合。那么其解决思路为:
网页端(前端
分页
要使用异步加载):
在页面初始化的时候