若依-分页查询失效
list是进行了分页操作的,如果我本函数的返回值就是getDataTable(list),那么我的分页查询出错不了一点。在使用若依框架开发管理后台的时候,由于业务逻辑的需要,自己定义了一个DTO类,将与数据库对应的entity类进行封装。在进行二次封装之后发现返回的数据没有进行分页,并且总数也只为10(数据库总共90多条数据,每页数据数量为10),也就是只有一页的数据。我的代码是带有startPa
一、问题
在使用若依框架开发管理后台的时候,由于业务逻辑的需要,自己定义了一个DTO类,将与数据库对应的entity类进行封装。后需要将若依自带的selectList查询所有返回的List进行二次封装成一个ArrayList返回给前端。
在进行二次封装之后发现返回的数据没有进行分页,并且总数也只为10(数据库总共90多条数据,每页数据数量为10),也就是只有一页的数据。
错误代码:
@GetMapping("/list")
public TableDataInfo list(TbInstitution tbInstitution) {
startPage();
List<TbInstitution> list = tbInstitutionService.selectTbInstitutionList(tbInstitution);
ArrayList<InstitutionDTO> institutionDTOS = new ArrayList<InstitutionDTO>();
for (TbInstitution institution : list) {
institution.setLogo(host + institution.getLogo());
institution.setBusinessLicense(host + institution.getBusinessLicense());
if (!institution.getOtherMaterials().isEmpty()) {
institution.setOtherMaterials(host + institution.getOtherMaterials());
}
InstitutionDTO institutionDTO = BeanUtil.copyProperties(institution, InstitutionDTO.class);
User user = userService.selectUserByUserId(institution.getUserId());
institutionDTO.setUserName(user.getUserName());
institutionDTO.setEmail(user.getEmail());
institutionDTOS.add(institutionDTO);
}
return getDataTable(institutionDTOS);
}
二、原因
我们需要关注两个若依给我们提供的工具,startPage()和getDataTable
其中startPage是本问题的关键。
startPage():开启下面代码距离最近的一个select语句的分页查询。
我的代码是带有startPage的,也就是startPage开启了我下面这行代码的分页。
startPage();
List<TbInstitution> list = tbInstitutionService.selectTbInstitutionList(tbInstitution);
list是进行了分页操作的,如果我本函数的返回值就是getDataTable(list),那么我的分页查询出错不了一点。但是我需要的不是这个List,而是下面我自己封装的ArrayList institutionDTOS。而这个institutionDTOS是没有进行过分页操作的。
三、解决办法
既然别人的东西不靠谱,那么我们就写一个自己的东西,我们自己写一个分页查询,来替换掉这个接口。代码如下:
// 前端,事件
getList() {
this.loading = true;
listInstitution(this.queryParams.pageNum, this.queryParams.pageSize).then(response => {
this.institutionList = response.data;
this.total = response.total;
this.loading = false;
});
},
// 前端,发送请求
export function listInstitution(pageNum, pageSize) {
return request({
url: `/igxia/institution/list/${pageNum}/${pageSize}`,
method: 'get',
})
}
// 后端
// controller
@GetMapping("/list/{pageNum}/{pageSize}")
public Page<InstitutionDTO> listDto(@PathVariable Integer pageNum, @PathVariable Integer pageSize,) {
return tbInstitutionService.selectAll(pageNum, pageSize);
}
// service
Page<InstitutionDTO> selectAll(Integer pageNum, Integer pageSize);
// serviceImpl
@Override
public Page<InstitutionDTO> selectAll(Integer pageNum, Integer pageSize, String institutionFullName) {
int total = tbInstitutionMapper.selectDtoCount();
int pages = (total + pageSize - 1) / pageSize;
if (total % pageSize != 0) {
pages++;
}
int offset = (pageNum - 1) * pageSize; // 计算offset
List<TbInstitution> list = tbInstitutionMapper.selectDto(offset, pageSize);
ArrayList<InstitutionDTO> institutionDTOS = new ArrayList<>();
//我的业务逻辑,可以不用管 --begin
for (TbInstitution institution : list) {
institution.setLogo(host + institution.getLogo());
institution.setBusinessLicense(host + institution.getBusinessLicense());
if (!institution.getOtherMaterials().isEmpty()) {
institution.setOtherMaterials(host + institution.getOtherMaterials());
}
InstitutionDTO institutionDTO = BeanUtil.copyProperties(institution, InstitutionDTO.class);
User user = userService.selectUserByUserId(institution.getUserId());
institutionDTO.setUserName(user.getUserName());
institutionDTO.setEmail(user.getEmail());
// --end
institutionDTOS.add(institutionDTO);
}
return new Page<InstitutionDTO>(institutionDTOS, total); // 直接返回查询结果即可
}
// mapper.java
List<TbInstitution> selectDto(@Param("offset") Integer offset, @Param("pageSize") Integer pageSize);
@Select("SELECT count(0) FROM tb_institution")
int selectDtoCount();
// mapper.xml
<select id="selectDto" resultType="com.ruoyi.system.domain.TbInstitution" resultMap="TbInstitutionResult">
select * from tb_institution order by create_time desc limit #{offset}, #{pageSize}
</select>
其中需要重新封装一个Page类,如下所示
package com.ruoyi.system.domain.page;
import lombok.Data;
import java.util.List;
/**
* @Author: igxia
* @Description:
* @Date: 2023/6/7 16:35
* @Version 1.0
*/
@Data
public class Page<T> {
private List<T> data;
private long total;
private int pageNum;
private int pageSize;
private int pages;
public Page(List<T> data, long total) {
this.data = data;
this.total = total;
this.pages = (int) Math.ceil((double) total / pageSize);
}
}
自己重新封装之后调用,前端可以正常分页。
更多推荐
所有评论(0)