问题:在使用若依框架的过程中,列表分页失效,只能显示十条数据,没有分页工具,十条之外的数据只能通过列表的显示行数来控制显示
1、原因
分页工具只能在数据查询出来不做任何处理的情况下使用,因为这个时候列表的总数是固定的,分页的参数可控。以若依自己的代码为例: Controller层:
@RequiresPermissions("system:user:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}
Service层:
@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user)
{
return userMapper.selectUserList(user);
}
数据在被查询出来之后直接分页,分页功能妥妥地好用! 如果碰到查询数据再次附加查询数据的情况,就没法进行列表的分页。
2、解决方法
碰到数据需要处理的情况,只有一种办法就是在service层逻辑的最后一句,将所有的数据都查出来下面说一下具体解决办法:
步骤一:在新建controller里面继承若依自带的BaseController
步骤二:Contorller层写法
加入startPage()和getDataTable():
@RequiresPermissions("xx:xx:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(xx xx, Integer pageNum,Integer pageSize)
{
startPage();
List<xx> list = xxService.selectxxList(xx,pageNum,pageSize);
return getDataTable(list);
}
步骤三:Service层写法
在查询所有数据的语句之前加一句:
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
PageHelper.startPage(pageNum, pageSize);
}
以下是代码逻辑:查出所有符合要求的id,用id集合一起查询列表数据
@Override
public List<xx> selectxxList(xx xxOld,Integer pageNum,Integer pageSize) {
List<Long> xxIds = new ArrayList<Long>();
List<Long> xxIdAll = new ArrayList<Long>();
List<xx> xxAll = new ArrayList<xx>();
xx xx = new xx();
xx.setzz("3");
achievementSelectionIds = xxMapper.xxIds(xx);
xxIdAll.addAll(xxIds);
xx.setzz("1");
xxIds = xxMapper.xxIds(xx);
xxIdAll.addAll(xxIds);
List<Long> idlistWithoutDuplicates = null;
if(!xxIdAll.isEmpty()) {
idlistWithoutDuplicates = removeDuplicate(achievementSelectionIdAll);
Collections.sort(idlistWithoutDuplicates, new Comparator<Long>() {
@Override
public int compare(Long o1, Long o2) {
try {
if (o1 > o2) {
return -1;
} else if (o1 < o2) {
return 1;
} else {
return 0;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
});
}
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
PageHelper.startPage(pageNum, pageSize);
}
xxAll = achievementSelectionMapper.xxSelections(xxOld, idlistWithoutDuplicates);
return xxAll;
}
private static List<Long> removeDuplicate(List<Long> list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if(i!=j&&list.get(i)==list.get(j)) {
list.remove(list.get(j));
}
}
}
return list;
}
步骤三:Mapper层写法:
注意:这是遍历所有id的写法
<if test="list != null and list != ''">
and achievement_id in
<foreach item="xxId" collection="list" open="(" separator="," close=")">
</foreach>
</if>
|