今天寫mybatis-plus 多表條件分頁查詢的時候碰到很多問題,這里記錄下
首先說下業務,這個是要展現的頁面。根據篩選的條件對數據進行分頁查詢。
1. 建立一個dto來對應查詢條件,我這個dto是繼承了自己寫的分頁用的model,主要是為了分頁的時候不用再寫pagesize和page
@Setter @Getter @NoArgsConstructor @AllArgsConstructor public class PagedWeeklyDto extends PagedModel { @ApiModelProperty(value = "查詢開始時間") private LocalDateTime queryStartTime; @ApiModelProperty(value = "查詢結束時間") private LocalDateTime queryEndTime; @ApiModelProperty(value = "反饋狀態 '1'表示已反饋 '0'表示未反饋 '-1'表示全部狀態") private String feedbackStatus; @ApiModelProperty(value = "所選用戶Account集合 List<String>類型") private List<String> createAccounts; }
2 .還是像往常一樣去建立page和querywapper,這里要注意下,一定要引入分頁的插件,不引入的話會報錯
@Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); }
3. 建立page和querywapper對象,這里要具體說一下。這個 wi 指的是你sql中的表名,因為我的多表中基本都有這個字段,不加的話,會出現字段指定不明確的錯誤。
service:
// 構造分頁對象 Page<PagedWeeklyVo> page = new Page<>(pagedWeeklyDto.getPageNo(),pagedWeeklyDto.getPageSize()); // 構造查詢對象 QueryWrapper<Info> queryWrapper = new QueryWrapper(); queryWrapper.and( v-> v.in("wi.create_account",createAccounts)); if(!StatusEnum.ALL_FEEDBACK.getCode().equals(feedbackStatus)){ queryWrapper.eq("wi.feedback_status",feedbackStatus); } queryWrapper.ge("wi.create_time",queryStartTime); queryWrapper.le("wi.create_time",queryEndTime);
mapper:這個是mapper層代碼,我沒有寫到xml中(公司不允許)。我這里查詢的條件是封裝到querywapper中的,沒有在sql中寫,這里 ${ew.customSqlSegment} 必須要,這個是引用參數中的條件,page必須放到第一位,和 basemapper中selectPage是一個道理
@Select("select wi.weekly_no as weeklyNo,wi.feedback_status as feedbackStatus,wi.read_status as readStatus,wi.create_time as createTime,\n" +
" pc.content,\n" +
" pm.avatar,pm.name as nickname\n" +
"from weekly_info wi left outer join project_content pc on wi.weekly_no = pc.weekly_no\n" +
" left outer join project_member pm on pc.create_account = pm.account ${ew.customSqlSegment}")
IPage<PagedWeeklyVo> searchWeeklyPage(Page<PagedWeeklyVo> page, @Param(Constants.WRAPPER) QueryWrapper<Info> queryWrapper);
其實寫完后覺得沒啥,但是在寫的時候出現很多問題,大家一定要注意字段必須要表明是哪個表的,就是第三個點。還有就是分頁sql一定要按照某個字段進行排序,排序的字段最好是唯一的,因為每次查詢的話數據的位置不一樣,會造成分頁出現數據一樣的情況,我這里忘記加了。