You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA中Page.getTotalElements()返回值异常问题求助

Spring Boot JPA分页getTotalElements()返回异常问题解决

问题现象

数据库表共14条记录,某次带条件查询实际匹配6条记录,但分页请求时getTotalElements()返回值异常:

  • 请求page=0、size=20:返回6,正常;
  • 请求page=1、size=20:返回14,异常(当前页无数据);
  • 请求page=0、size=4:返回14,异常;
  • 请求page=1、size=4:返回6,正常;
    查询返回的数据内容正确,但总记录数时而返回全表总数。

问题根源

仓库层的@Query注解中,countQuery参数写死为查询全表记录数,没有应用主查询中的过滤条件(WhereOptionQuery部分):

countQuery = "SELECT COUNT(club_id) FROM club"

JPA分页时会根据分页参数判断执行逻辑:当当前页起始位置超过全表总数时,直接使用countQuery的结果;而当主查询能返回结果时,可能通过主查询结果集计算总数,这就导致getTotalElements()返回值时而正确时而错误。

解决方案

修改countQuery,使其包含与主查询一致的过滤条件,拼接WhereOptionQuery:

@Query(nativeQuery = true, value = searchDefaultQuery+ WhereOptionQuery +
            "ORDER BY created_date DESC",
            countQuery = "SELECT COUNT(club_id) FROM club " + WhereOptionQuery)
Optional<Page<Club>> findByConditionsOrderByDate (@Param("standard_point") String point, @Param("distance")Integer distance,
                                                  @Param("state")String state, @Param("category")String category, @Param("memberNum")Integer memberNum,
                                                  @Param("tags")String tags, Pageable pageable);

修改后countQuery会和主查询一样应用所有过滤条件,返回的总记录数始终是符合查询条件的结果总数,getTotalElements()即可返回正确值。

内容的提问来源于stack exchange,提问作者GyeongEun Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:17:26