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
相关产品推荐
相关产品推荐

