最近在实际项目中发现了一个问题。在使用mybatis plus做查询的时候,需要关联两张表查询。 默认情况下,因为数据量不大,习惯先找到主表查询出id的集合,转而以这个id的list作为条件去检索下一张表。实际的要求是最后返回的数据要以第一张表的create_time做倒序。 在第一次查询的时候,确实做了时间的排序,但是当检索下一张表的时候,因为使用了in() 影响了最后的查询结果,没能保证最后输出的顺序。

  一开始没有注意到这个问题,最后发现使用in()的时候,并不能保证按照传入参数的顺序查询。 解决的办法就是使用field()函数即可。

  假设通过传入的ID 集合顺序来对查询排序,就可以这么用

orader by field(ID,*,*,*,*,*)

  这里ID是字段,后面的* 表示需要传入的参数。

  接下来就是怎么如何使用mybatis plus去实现了。

 StringBuilder orderSql = new StringBuilder();
        orderSql.append("order by field(ID,");
        int length = paramIds.size();
        for(int i= 0; i<length; i++){
            if(i==0){
                orderSql.append(paramIds.get(i));
            }else{
                orderSql.append(",")
                        .append(paramIds.get(i));
            }
            if (i==length-1){
                orderSql.append(")");
            }
        }
        queryWrapper.in(CollectionUtil.isNotEmpty(paramIds),"ID",paramIds)
                .last(orderSql.toString());