[评论分页逻辑隐患] run.halo.app.service.impl.BaseCommentServiceImpl#pageVosBy:173使用的subList可能会有分页问题

yx2lnoni  于 2022-11-02  发布在  其他
关注(0)|答案(6)|浏览(171)

是什么版本出现了此问题?

1.4.13

使用的什么数据库?

MySQL 8.x

使用的哪种方式部署?

Docker

在线站点地址

https://halo.cyblogs.top

发生了什么?

因为 run.halo.app.service.impl.BaseCommentServiceImpl#pageVosBy:173 使用了subList做了分页,所以可能会出现未开启评论审核功能时,每当新评论添加后,在旧页面中停留的用户,点击评论的第二页时,列表中出现了上一页中的最后一条数据。

相关日志输出

暂无

附加信息

暂无

eanckbw9

eanckbw91#

你好,确实存在这样的问题,你有什么好的解决方案吗?

w8rqjzmb

w8rqjzmb2#

Thanks for reaching out here @CodeLunatic ! I'll be in charge of this problem.
/assign @JohnNiang

tp5buhyn

tp5buhyn3#

Hi @CodeLunatic , I found that you have located the cause of this problem, are you interested in fixing this problem?

hrirmatl

hrirmatl4#

@ruibaby 提供一个我们现在项目中的解决方案吧,代码如下,思路在注解中说明,这个思路是关于SQL如何避免这样的情况的,subList分页的话,可能还需要使用类似于JavaScript中的findIndex方法先查询到index,然后再做分页。

/**

* 分页原理:
* <p>
* 利用prev记录上一页最后一条的Id, 利用q记录上一页最后一条的排序值, 然后根据prev和q进行WHERE查询,
* Id和排序字段一样也需要进行排序, Id的排序放在排序字段的后面,作为备用排序, 最后一定要添加上LIMIT关键字进行限制条数
* <p>
* 例如:
* SELECT * from table_xxx
* WHERE
* (index < #{q} or index = #{q}) and id < #{prev}
* ORDER BY
* index DESC,
* id DESC
* LIMIT #{size};
* <p>
* 如果排序字段(q)的值都相同,那么Id字段(prev)的排序将派上用场,否则为排序字段(q)优先
* /

@Data
@Accessors(chain = true)
@ApiModel(value = "分页信息(沿用第一版本)")
public class PageVo {

    @ApiModelProperty(value = "上页最后条目的ID")
    private Long prev = -1L;

    @ApiModelProperty(value = "上页最后条目的排序值")
    private Long q = -1L;

    @ApiModelProperty(value = "是否是第一页")
    private Boolean start = false;

    @ApiModelProperty(value = "是否最后一页")
    private Boolean end = false;
}

@JohnNiang 我非常有兴趣解决这个问题,您看这样的方案怎么样呢

pb3skfrl

pb3skfrl5#

@CodeLunatic 不好意思这么晚才回复。

如果按照这种方案来查询的话,对于新的评论何时才能被查询出来呢?

yftpprvb

yftpprvb6#

@JohnNiang 当 prevq 为非法值的时候,比如说 -1 或者 0

相关问题