分页查询Page的getSize与getTotalElements使用对比

本文对比了SpringData中Page.getSize()与Page.getTotalElements()的区别,通过具体代码示例展示了两者在分页结果上的不同表现,指出前者得到的是每页显示数量,而后者是总记录数。

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

    开始用到SpringData分页,在跟着资料写项目的时候,看到分页的数量和返回的不一致。

一.使用Page.getSize

    @RequestMapping(value = "/search/{page}/{size}", method = RequestMethod.POST)
    public Result findSearch(@RequestBody Map searchMap,@PathVariable int page,@PathVariable int size) {
        Page<Label> pageList = labelService.findSearch(searchMap, page, size);
        PageResult pageResult = new PageResult<Label>(pageList.getTotalElements(), pageList.getContent());// 资料中使用的是这种,Page.getTotalElements()
        return new Result(true, StatusCode.OK, "查询成功", pageResult);
    }

    分页结果:主要是total不同,这里的total不等于当前的rows的大小。

{
    "flag": true,
    "code": 20000,
    "message": "查询成功",
    "data": {
        "total": 9,
        "rows": [
            {
                "id": "3",
                "labelname": "C++",
                "state": "1",
                "count": null,
                "recommend": "2",
                "fans": null
            },
            {
                "id": "4",
                "labelname": "python",
                "state": "1",
                "count": null,
                "recommend": "2",
                "fans": null
            }
        ]
    }
}

 

二.使用Page.getTotalElements

    @RequestMapping(value = "/search/{page}/{size}", method = RequestMethod.POST)
    public Result findSearch(@RequestBody Map searchMap,@PathVariable int page,@PathVariable int size) {
        Page<Label> pageList = labelService.findSearch(searchMap, page, size);
        PageResult pageResult = new PageResult<Label>(Long.valueOf(pageList.getSize()), pageList.getContent());// 我自己修改后的,使用Page.getSize()
        return new Result(true, StatusCode.OK, "查询成功", pageResult);
    }

    我的分页结果:total的值等于rows的大小。

{
    "flag": true,
    "code": 20000,
    "message": "查询成功",
    "data": {
        "total": 2,
        "rows": [
            {
                "id": "3",
                "labelname": "C++",
                "state": "1",
                "count": null,
                "recommend": "2",
                "fans": null
            },
            {
                "id": "4",
                "labelname": "python",
                "state": "1",
                "count": null,
                "recommend": "2",
                "fans": null
            }
        ]
    }
}

 

    暂时先记录一下,两者的区别等项目完成后,看源码找答案。

转载于:https://my.oschina.net/javamaster/blog/2223100

<think>嗯,用户现在想了解如何使用JPA进行分页查询,并且需要示例。之前他们问过关于模糊查询的问题,现在转向分页了。我需要结合他们提供的三个引用来回答,特别是引用1、2和3。首先,引用1提到JPA分页查询和多条件分页查询,用户可能希望看到如何结合条件查询和分页。引用2展示了两种分页方法,一种是使用原生SQL,另一种是JPQL,并且提到了PagePageable的使用。引用3则是一个简单的分页循环示例,可能用户需要基础的分页实现。我需要确保回答覆盖基本的分页方法、条件分页以及可能的优化。用户可能需要代码示例,所以应该提供几种不同的方式,比如方法命名、@Query注解、Specification动态查询等。同时,分页排序也是关键点,需要包含如何添加排序参数。 另外,用户之前的回答里提到了模糊查询的分页,所以可能需要在分页示例中结合模糊条件。比如在方法命名中使用Containing,并加上Pageable参数。引用2中的@Query示例有模糊查询,可以整合进来。 还要注意分页查询的性能,比如正确使用countQuery,特别是在原生查询时,避免分页性能问题。引用2中的countQuery就是一个好例子,需要强调这一点。可能用户还会关心如何获取分页后的数据,比如总页数、当前页内容等,所以示例中应该展示如何使用Page对象的方法,如getContent(),getTotalPages()等。最后,生成相关问题,考虑用户可能接下来会问的问题,比如多表分页、动态条件分页、排序等,确保相关问题分页相关,并且基于之前的引用内容。</think>### JPA分页查询实现方法详解 --- #### 一、基础分页查询(无条件) 使用`Pageable`接口实现简单分页 *引用自[3]* ```java // 分页参数设置(页码从0开始) Pageable pageable = PageRequest.of(0, 10); // 第1页,每页10条 // 执行分页查询 Page<User> page = userRepository.findAll(pageable); // 获取结果 List<User> content = page.getContent(); // 当前页数据 long totalElements = page.getTotalElements(); // 总记录数 int totalPages = page.getTotalPages(); // 总页数 ``` **关键参数**: - `PageRequest.of(page, size)`:创建分页请求 - `PageRequest.of(page, size, Sort.Direction.DESC, "createTime")`:带排序的分页[^1] --- #### 二、条件分页查询(3种方式) ##### 方法1:方法命名自动生成 *引用自[1]* ```java public interface UserRepository extends JpaRepository<User, Long> { // 模糊查询+分页 Page<User> findByUsernameContaining(String keyword, Pageable pageable); // 多条件分页(支持AND/OR组合) Page<User> findByUsernameContainingAndAgeGreaterThan(String nameKey, int minAge, Pageable pageable); } ``` **调用示例**: ```java Page<User> result = userRepository.findByUsernameContaining("张", PageRequest.of(0, 10, Sort.by("createTime").descending())); ``` ##### 方法2:@Query自定义查询 *引用自[2]* ```java public interface ProductRepository extends JpaRepository<Product, Long> { // JPQL分页查询 @Query("SELECT p FROM Product p WHERE p.price > :minPrice") Page<Product> findExpensiveProducts(@Param("minPrice") double price, Pageable pageable); // 原生SQL分页(必须指定countQuery) @Query(value = "SELECT * FROM products WHERE category = ?1", countQuery = "SELECT COUNT(*) FROM products WHERE category = ?1", nativeQuery = true) Page<Product> findByCategory(String category, Pageable pageable); } ``` ##### 方法3:动态条件组合(Specification) *引用自[1]* ```java // 定义动态条件 Specification<User> spec = (root, query, cb) -> { List<Predicate> predicates = new ArrayList<>(); predicates.add(cb.like(root.get("username"), "%张%")); predicates.add(cb.greaterThan(root.get("age"), 18)); return cb.and(predicates.toArray(new Predicate[0])); }; // 执行分页查询 Page<User> page = userRepository.findAll(spec, PageRequest.of(0, 10, Sort.by("age").ascending())); ``` --- #### 三、分页结果处理 | 方法 | 描述 | 示例值 | |-----------------------|----------------------------------|------------------| | page.getContent() | 获取当前页数据列表 | List<User> | | page.getTotalPages() | 获取总页数 | 5 | | page.getTotalElements() | 获取总记录数 | 48 | | page.hasNext() | 判断是否有下一页 | true/false | | page.isFirst() | 判断是否是第一页 | true/false | **遍历所有分页数据示例**: *引用自[3]* ```java int pageIndex = 0; int pageSize = 200; Page<User> page; do { Pageable pageable = PageRequest.of(pageIndex++, pageSize); page = userRepository.findAll(pageable); processData(page.getContent()); // 处理当前页数据 } while (page.hasNext()); ``` --- ### 分页性能优化建议 1. **索引优化**:为排序字段和查询条件字段建立复合索引 2. **避免全表扫描**:分页参数`WHERE`条件配合使用 3. **原生SQL分页**:必须显式指定`countQuery`[^2] 4. **游标分页**:大数据量时使用`WHERE id > ? LIMIT n`代替传统分页 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值