首页 > 技术文章 > mybatis-plus 多表条件分页查询

liuxuebagaomizhe 2020-09-23 18:32 原文

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

 

推荐阅读