使用Java实现统一分页排序组件_Java查询条件封装解析

Java统一分页排序组件通过PageRequest封装分页排序参数并校验,JPA用Criteria+Specification解耦条件,MyBatis用QueryParamWrapper+动态SQL,统一返回PageResult响应。

Java中实现统一分页排序组件,关键在于将分页参数(如当前页、每页大小)和排序规则(字段名、升序/降序)与业务查询条件解耦,同时提供灵活的条件封装能力。核心思路是定义通用参数载体,配合构建器模式或注解解析,让DAO层只关注数据逻辑,不重复处理分页排序。

统一参数对象:PageRequest

定义一个不可变的分页排序请求类,整合offset/limit、排序字段及方向:

  • 使用pageNumpageSize计算offset(避免前端传错offset)
  • 支持多字段排序,如sort=createTime,desc;userName,asc,解析为List
  • 可添加@Valid校验:pageNum ≥ 1,pageSize ∈ [1, 500]

查询条件封装:Criteria + Specification(JPA场景)

面向JPA时,推荐用Specification封装动态条件,配合自定义Criteria类屏蔽底层细节:

  • Criteria作为DTO接收前端参数(如nameLike、statusIn、startTimeGte),不做数据库映射
  • 编写CriteriaToSpecConverter,将Criteria转为Specification,自动处理like、in、between、null判断等
  • 在Service中组合:spec.and(sortSpec).and(pageSpec),保持逻辑清晰

MyBatis场景:ParamWrapper + 动态SQL

对MyBatis,通过封装参数对象+XML中标签实现条件拼装:

  • 定义QueryParamWrapper继承PageRequest,增加业务字段(如userNamedeptId
  • Mapper XML中用处理列表条件;排序用${sortSql}(注意防范SQL注入,仅允许白名单字段)
  • 在Mapper接口方法上加@Param("p"),使XML能访问p.pageNu

    m
    p.sortFields

统一响应结构:PageResult

对外返回标准化分页结果,隐藏物理分页细节:

  • 包含total(总条数)、list(当前页数据)、pageNum/pageSizepages(总页数)
  • 构造时由DAO返回Page(Spring Data)或自定义PageResult.from(total, data)
  • 避免暴露offsetlimit等底层参数,提升API一致性