问题
使用mybatis plus selectPage queryWrapper in pagedIds 时,查询结果的id顺序和传入的id顺序不一致.如下图
原因
MyBatis 的 LambdaQueryWrapper
本身没有直接支持根据 List
中的顺序进行排序的功能。它会生成 IN
查询,但是不会保证结果的顺序与 List
中的元素顺序一致。为了确保查询结果按照 pagedIds
列表中的顺序返回,需要在查询中显式指定排序顺序。
解决方案
在 MySQL 中,可以使用
FIELD()
函数来根据指定顺序对结果进行排序。你可以在LambdaQueryWrapper
中使用.last()
方法来添加自定义的 SQL 语句,从而实现按pagedIds
顺序排序。
实现
将pagedIds构造为FIELD 排序 SQL 片段,再在queryWrapper中添加自定义sql语句
// 构造 FIELD 排序 SQL 片段
String orderByField = pagedIds.stream()
.map(String::valueOf)
.collect(Collectors.joining(",", "FIELD(id,", ")"));
Page<HlCar> rowPage = new Page(1, reqVo.getPageSize());
LambdaQueryWrapper<HlCar> queryWrapper = new LambdaQueryWrapper<HlCar>()
.in(HlCar::getId, pagedIds)
.last("ORDER BY " + orderByField);;
carPage = hlCarMapper.selectPage(rowPage, queryWrapper);
查询出的顺序完全一致了