pagehelper一对多分页失效

若依自带的分页插件 pagehelper,在查询数据是一对一的时候是没有任何问题,但是当遇到一对多的时候,分页就会失效。解决办法,自己写分页,先把主表一对一的数据查出来,再通过stream流来处理。

 1 封装返回数据的工具类

package com.ruoyi.util;

import java.util.List;

/**
 * 封装返回分页数据
 *
 */
public class QueryResult<T> {

	// 总条数
	private Integer totals;

	// 返回的数据
	private List<T> data;

	public QueryResult() {
		super();
	}

	public QueryResult(Integer totals, List<T> data) {
		super();
		this.totals = totals;
		this.data = data;
	}

	public Integer getTotals() {
		return totals;
	}

	public void setTotals(Integer totals) {
		this.totals = totals;
	}

	public List<T> getData() {
		return data;
	}

	public void setData(List<T> data) {
		this.data = data;
	}

}

 pagehelper分页插件官网给出了以下几种调用方式:

//第一种,RowBounds方式的调用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<Country> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum,
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<Country> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<Country> list = countryMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectLike(country);
    }
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));

我们这里采用的是第六种 jdk8的lambda用法

3 service层代码 处理数据

public QueryResult<QuestionVo> getList(QuestionQuery query) {

        int num = questionQuery.getNum();
        int size = questionQuery.getSize();

        PageInfo<Question> pageInfo = PageHelper.startPage(num, size)
                .doSelectPageInfo(() -> questionMapper.getQuestionList(query) );
        //获取分页总条数
        int total = (int) pageInfo.getTotal();
        List<Question> list = pageInfo.getList();
        List<Long> questionIdList = list.stream().map(Question::getQuestionId).collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(questionIdList)) {
            List<QuestionOption> questionOptionList = questionOptionMapper.getOptions(questionIdList);
            Map<Long, List<QuestionOption>> map = questionOptionList.stream().collect(Collectors.groupingBy(DtQuestionOption::getQuestionId));
            list.forEach(questionVo -> questionVo.setOptions(map.get(questionVo.getQuestionId())));
        }

        return new QueryResult<>(total, list);
    }

写完才发现,其实用若依的框架也可以,不用pageHelper,先把一对一的数据查出来,再通过一对多的数据进行关联起来就行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对Spring Boot集成PageHelper实现一对多分页,可以按照以下步骤进行操作: 1. 首先,在pom.xml文件中添加PageHelper依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency> ``` 2. 在application.properties或application.yml文件中配置PageHelper的属性: ```properties # MySQL数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root # PageHelper配置 pagehelper.helper-dialect=mysql pagehelper.reasonable=true pagehelper.support-methods-arguments=true pagehelper.params=count=countSql ``` 3. 创建一个包含一对多关系的实体类。例如,如果存在一个"User"实体类,每个用户可以有多个订单 "Order",那么可以这样定义实体类: ```java public class User { private Long id; private String name; private List<Order> orders; // 省略getter和setter方法 } public class Order { private Long id; private String orderName; // 省略getter和setter方法 } ``` 4. 创建Mapper接口和对应的SQL映射文件。在Mapper接口中声明需要的查询方法: ```java @Mapper public interface UserMapper { List<User> getUsersWithOrders(); } ``` 在对应的SQL映射文件中编写相应的查询语句,关联查询用户和订单信息。 5. 在Service层中调用Mapper接口中的方法: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public PageInfo<User> getUsersWithOrders(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.getUsersWithOrders(); return new PageInfo<>(users); } } ``` 6. 在Controller层中调用Service层的方法,并将结果返回: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public PageInfo<User> getUsers(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { return userService.getUsersWithOrders(pageNum, pageSize); } } ``` 这样,通过访问"/users"接口,即可实现一对多关系的分页查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值