最近在實際項目中發現了一個問題。在使用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());