今天写mybatis-plus 多表条件分页查询的时候碰到很多问题,这里记录下
- 建立一个dto来对应查询条件,我这个dto是继承了自己写的分页用的model,主要是为了分页的时候不用再写pagesize和page
@Getter
@Setter
@ApiModel(value = "ReHelpInfo分页请求", description = "求救单信息--分页请求参数")
public class ReHelpInfoQuery extends PagedModel{
@ApiModelProperty("应急事件名称")
private String disasterName;
}
- 还是像往常一样去建立page和querywapper,这里要注意下,一定要引入分页的插件,不引入的话会报错
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 自动分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 防止全表更新与删除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}
- 建立page和querywapper对象,这里要具体说一下。这个 rd指的是你sql中的表名,因为我的多表中基本都有这个字段,不加的话,会出现字段指定不明确的错误。
@Override
public IPage<ReHelpQueryVo> page(ReHelpInfoQuery query) {
//进行条件构造
// 条件查询
QueryWrapper<ReHelpQueryVo> queryWrapper = new QueryWrapper<>();
if(query.getPageNo() == null || query.getPageSize() == null) {
log.info("分页对象为空");
return null;
}
// 构建分页对象
Page queryPage = new Page<>(query.getPageNo(), query.getPageSize());
if(StringUtils.isNotBlank(query.getDisasterName())){
queryWrapper.like("rd.disaster_name",query.getDisasterName());
}
queryWrapper.orderByDesc("rh.create_time");
// 分页查询
IPage<ReHelpQueryVo> iPage = reHelpInfoMapper.findPage(queryPage , queryWrapper);
return iPage;
}
- ** mapper:这个是mapper层代码,我没有写到xml中(可以写)。我这里查询的条件是封装到querywapper中的,没有在sql中写,这里 ${ew.customSqlSegment} 必须要,这个是引用参数中的条件,page必须放到第一位,和 basemapper中selectPage是一个道理**
@Select("select rh.*,rd.disaster_name from re_help_info rh inner join re_disaster_info rd on rh.disaster_id=rd.id ${ew.customSqlSegment}")
IPage<ReHelpQueryVo> findPage(Page<ReHelpQueryVo> page, @Param(Constants.WRAPPER) QueryWrapper<ReHelpQueryVo> queryWrapper);