今天写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一定要按照某个字段进行排序,排序的字段最好是唯一的,因为每次查询的话数据的位置不一样,会造成分页出现数据一样的情况,我这里忘记加了。