一.返回数据不是实体类
startPage()方法是MyBatis的一个分页插件,它会自动拦截后续的数据库查询语句,根据指定的页码和每页大小进行分页查询。当结果返回的是实体类的集合时,startPage()可以正常起作用,因为它可以对实体类的集合进行拦截并进行分页处理。
然而,如果结果不是实体类的集合,而是其他类型的数据(如数组、Map等),startPage()无法对这些非实体类的数据进行拦截和分页处理。这就是为什么在你提供的代码中,使用了 startPage(),但是分页功能并未生效的原因。
如果你希望对非实体类的数据进行分页,你可以使用 PageHelper插件的另一种分页方式,即使用 PageInfo类进行手动分页。下面是修改后的代码示例
@GetMapping("/findBydept")
public R findPhoneByDept(@RequestParam String dept, @RequestParam int pageNum, @RequestParam int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<PhoneVO1> phoneVO1s = phoneServiceImpl.selectByDeptAndSmsType(dept);
PageInfo<PhoneVO1> pageInfo = new PageInfo<>(phoneVO1s);
// 返回结果
HashMap<String, Object> map = new HashMap<>();
map.put("rows", phoneVO1s);
map.put("code", HttpStatus.SUCCESS);
map.put("msg", "查询成功");
map.put("total", pageInfo.getTotal());
return R.ok(map);
二.其他可能存在的问题
1.PageHelper.startPage () 必须加在执行查询sql语句方法之前。如若不然,会导致数据库查询时,分页失效。
2.return返回的对象,必须是startPage()的下一行代码返回的对象。如若不然,会导致返回的结果,丢失当前页,总页数,总条数等数据。
比如你在实现类方法中会执行两个sql, 那么分页插件只会对第一个sql进行分页,第二个sql就不会分页查询.如果刚好你最终返回的是第二个sql结果,那么就会认为是分页插件失效了.
实际上并没有失效,而是你的顺序弄错了导致的
错误示范:
public List<User> getList(User user){
// 开启分页
startPage();
// 执行第一个sql
mapper.getOne(user);
// 执行第二个sql
List<User> list = mapper.getTwo(user);
return getDataTable(list);
}
正确示范:
public List<User> getList(User user){
// 开启分页
// startPage();
// 执行第一个sql
mapper.getOne(user);
// 开启分页
startPage();
// 执行第二个sql
List<User> list = mapper.getTwo(user);
return getDataTable(list);
}
3.若使用mysql版本高于5.6,或postgresql是高版本,且排序字段不唯一,分页时则会出现重复数据。