最近在实际项目中发现了一个问题。在使用mybatis plus做查询的时候,需要关联两张表查询。 默认情况下,因为数据量不大,习惯先找到主表查询出id的集合,转而以这个id的list作为条件去检索下一张表。实际的要求是最后返回的数据要以第一张表的create_time做倒序。 在第一次查询的时候,确实做了时间的排序,但是当检索下一张表的时候,因为使用了in() 影响了最后的查询结果,没能保证最后输出的顺序。
一开始没有注意到这个问题,最后发现使用in()的时候,并不能保证按照传入参数的顺序查询。 解决的办法就是使用field()函数即可。
假设通过传入的ID 集合顺序来对查询排序,就可以这么用
1 | orader by field(ID,*,*,*,*,*) |
这里ID是字段,后面的* 表示需要传入的参数。
接下来就是怎么如何使用mybatis plus去实现了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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()); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix