最近在实际项目中发现了一个问题。在使用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());