一、问题

在使用若依框架开发管理后台的时候,由于业务逻辑的需要,自己定义了一个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);
    }
}


自己重新封装之后调用,前端可以正常分页。

Logo

快速构建 Web 应用程序

更多推荐