Pagehelper 在count时过滤order by,导致返回total不正确

本文介绍了一种自定义Page<T>分页组件的实现方式,该组件能够与PageHelper和PageInfo配合使用,实现数据的分页查询和转换。通过具体的代码示例,展示了如何创建Model和Vo,以及在Service中使用自定义分页组件进行数据查询和转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 自定义Page<T>

import java.util.List;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

public class Page<T> {
    private List<T> list;
    private long total;
    private int pageNum;
    private int pageSize;

    public static void startPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
    }

    public static <T> Page<T> from(List<T> data) {
        PageInfo<T> page = new com.github.pagehelper.PageInfo<T>(data);
        Page<T> ret = new Page<>();
        ret.list = data;
        ret.total = page.getTotal();
        ret.pageNum = page.getPageNum();
        ret.pageSize = page.getPageSize();
        return ret;
    }

    public Page() {
    }

    public Page(List<T> list) {
        this.list = list;
    }

    public Page(List<T> list, int pageNum, int pageSize, long total) {
        this.list = list;
        this.total = total;
        this.pageNum = pageNum;
        this.pageSize = pageSize;
    }

    public List<T> getList() {
        return list;
    }

    public long getTotal() {
        return total;
    }

    public int getPageNum() {
        return pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }
}

 

  •  创建Model: RiskFundLog
  • 创建Vo: RiskFunkLogVo
  • Service如下
  @Override
    public Page<RiskFundLogVo> getRiskLog(int pageNum, int pageSize) {
        Page.startPage(pageNum, pageSize);
        List<RiskFundLog> pageList = riskFundLogDao.search(new RiskFundLog());

        try {
            if (CollectionUtils.isNotEmpty(pageList)) {
                List<RiskFundLogVo> ret = new ArrayList<>(pageList.size());
                for (RiskFundLog item : pageList) {
                    RiskFundLogVo vo = new RiskFundLogVo();
                    BeanUtils.copyProperties(vo, item);

                    ret.add(vo);
                }

                com.github.pagehelper.Page page = (com.github.pagehelper.Page)pageList;
                return new Page(ret, page.getPageNum(), page.getPageSize(), page.getTotal());
            }
        } catch (Exception e) {
            logger.error("RiskFundLogServiceImpl#getRiskLog exception occurred:", e);
        }

        List<RiskFundLogVo> emptyList = new ArrayList<>(1);
        RiskFundLogVo emptyObj = new RiskFundLogVo();
        emptyList.add(emptyObj);
        return new Page<>(emptyList);
    }

 

### PageHelper 自定义 Count 查询方法 当使用 MyBatis 和 PageHelper 进行分页查询,默认情况下 PageHelper 使用 `SELECT COUNT(*)` 来计算总记录数。然而,在某些场景下,可能希望自定义这个计数查询逻辑以提高性能或满足特定需求。 为了实现这一点,可以通过配置 PageHelper 插件来自定义 count SQL 语句[^1]。具体来说: #### 配置方式 可以在 mybatis-config.xml 中设置属性 `reasonable=true` 并启用 `autoRuntimeCountSql=false` 参数,这允许手动控制如何构建 count 查询语句[^4]。 ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 合理化参数 --> <property name="reasonable" value="true"/> <!-- 关闭自动运行生成的count sql--> <property name="autoRuntimeCountSql" value="false"/> </plugin> </plugins> ``` #### 实现自定义 Count 方法 对于具体的 Mapper 接口,可以创建一个专门用于返回总数的方法,并标记为 @Select 注解下的 SQL 片段。例如: ```java public interface UserMapper { /** * 获取用户列表并应用分页 */ List<User> selectUsers(Page<?> page); /** * 定义自定义的 count 查询 */ int customCount(); } ``` 对应的 XML 映射文件中定义如下: ```xml <select id="customCount" resultType="int"> SELECT SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as total_active_users, COUNT(1) AS all_users_count FROM users; </select> ``` 这里展示了一个更复杂的例子,其中仅统计了所有用户的数量,还特别关注活跃状态 (`status='active'`) 用户的数量。实际项目可以根据业务需求调整此 SQL 语句[^2]。 通过这种方式,就可以让 PageHelper 根据指定的 SQL 表达式来进行总计数操作而是默认的方式。需要注意的是,如果启用了缓存机制,则应确保这些变化会影响到缓存的一致性和准确性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值