最近在若依的基础上开发,因为若依自带分页所以一直就没考虑数据分页,最近发现数据库明明有数据,却只能查出前10条。
首先分析原因,我是在原来代码的基础上,重新封装了vo类返回给前端,导致的分页失效,首先看若依的分页源码是采用startPage()、getDataTable()两个方法对数据进行分页。
/** * 设置请求分页数据 */ protected void startPage() { PageDomain pageDomain = TableSupport.buildPageRequest(); Integer pageNum = pageDomain.getPageNum(); Integer pageSize = pageDomain.getPageSize(); if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); PageHelper.startPage(pageNum, pageSize, orderBy); } }/** * 响应请求分页数据 */ @SuppressWarnings({ "rawtypes", "unchecked" }) protected TableDataInfo getDataTable(List list) { TableDataInfo rspData = new TableDataInfo(); rspData.setCode(HttpStatus.SUCCESS); rspData.setMsg("查询成功"); rspData.setRows(list); rspData.setTotal(new PageInfo(list).getTotal()); return rspData; }
再看下自己的代码就发现分页是对原有基础的代码进行分页操作,而我重新封装的vo类,代码中并没有对其进行分页,而是走了默认的10条数据。
mybatis中解决方式:
由于若依默认用的是mybatis,先说下mybatis的解决方法,因为之前返回给前端的不是第一次查出来的数据,而是遍历又封装了一个集合返回的,所以我觉定修改查询方式,在查询时对封装的vo类进行查询,因为原有方法的数据列vo类中都存在,所以只需要修改xml文件添加方法即可,查询出来之后,再把需要自己处理的值放进去就可以保证返回的数据是第一次分页的数据。
控制层:创建新的方法
@GetMapping("/list") public TableDataInfo list(Commodity commodity) { startPage(); // List list = commodityService.selectCommodityList(commodity); List list =commodityService.selectVoList(commodity); return getDataTable(list); }
在xml文件中重新定义resultMap,作为查询vo类的标志,里面的映射跟原有一样即可(查询出来的数据跟原有一样)
....
对应方法
and name like concat('%', #{name}, '%') ...
这样查出来的数据类型就是之前我们封装好的vo类的类型,从而在查出来时,我们可以处理自己的业务逻辑,并将自己需要的字段值set进去,从而解决分页失效的问题。
@Override public List selectVoList(Commodity commodity) { List vos = commodityMapper.selectList(commodity); for (int i = 0; i < vos.size(); i++) { DsxsSpMoney dsxsSpMoney = new DsxsSpMoney(); dsxsSpMoney.setSpid(vos.get(i).getId()); List dsxsSpMonies = spMoneyMapper.selectDsxsSpMoneyList(dsxsSpMoney); vos.get(i).setSpmoneyList(dsxsSpMonies); } return vos; }
Mybatis-plus分页解决办法:
这里我用的思路都是一样的,就是查询时候自己定义多出来的数据列,查询出来之后,在将需要的数据set进去。
首先引用mybatis-plus自带的分页插件
@Configuration@MapperScan("com.lzq")@EnableTransactionManagementpublic class HospConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }}
重新定义实体类:使用@TableField(exist = false)注解定义数据库中不存在的类型
public class Commodity implements Serializable { private static final long serialVersionUID=1L;//原有的实体类 private Integer id; ...//数据库中不存在的类型 @TableField(exist = false) private List detials; @TableField(exist = false) private List pics; @TableField(exist = false) private List colors; @TableField(exist = false) private List jglist;}
接下来需要前端传入查询条件、页码、每页记录数来进行查询,编写控制层方法
@GetMapping("getCommodity") public R getCompanyList(Commodity commodity,Long page,Long limit){ Page pageParam = new Page(page, limit); QueryWrapper wrapper = new QueryWrapper(); if (commodity.getName()!=null){ wrapper.like("name", commodity.getName()); } if (commodity.getType()!=null){ wrapper.eq("type",commodity.getType()); } commodityService.page(pageParam,wrapper); List list = pageParam.getRecords(); for (int i = 0; i < list.size(); i++) { if (list.get(i).getPic()!=null){ String[] split = list.get(i).getPic().split(","); ArrayList arrayList = new ArrayList(); for (String pics:split) { arrayList.add(pics); } list.get(i).setPics(arrayList); } if (list.get(i).getDetial()!=null){ ... } if (list.get(i).getColor()!=null){ ... } ... } long total = pageParam.getTotal(); return R.ok().data("list",list).data("total",total); }
返回给前端数据以及总记录数。