使用Mybatis plus selectPage queryWrapper in时,查询结果的id顺序和传入的id顺序不一致

问题

使用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);

查询出的顺序完全一致了