Spring PagingAndSorting 存储库返回不一致的值

问题描述 投票:0回答:1

我有一致性问题,特别是在调用页面存储库方法时返回值。
我有一个控制器方法,它有参数:长会议 ID、字符串查询、可分页可分页。

@GetMapping("/api/conferences/{conferenceId}/submissions")
public Page<SubmissionDetailDto> getPagedSubmissionsByConferenceId(
    @PathVariable("conferenceId") Long conferenceId,
    @RequestParam(required = false) Optional<String> query,
    Pageable pageable
) {
    System.out.println("Get paged submissions by conferenceId, by query, was called, " + conferenceId + ", " + query);
    return submissionService.getPagedSubmissionsByConferenceIdSearchBySurname(conferenceId, query, pageable);
}

从控制器中,我调用一个服务方法来根据这些参数返回结果。

public Page<SubmissionDetailDto> getPagedSubmissionsByConferenceIdSearchBySurname(Long conferenceId, Optional<String> query, Pageable pageable) {
    String searchQuery = query.isPresent() ? query.get() : "";
    return (Strings.isBlank(searchQuery)) ?
        mapToPagedSubmissionDetail(submissionPageRepository.searchByConferenceIdOrderByOrderNumber(conferenceId, pageable)) :
        mapToPagedSubmissionDetail(submissionPageRepository.findByConferenceIdAndContactsSurnameStartsWithIgnoreCase(conferenceId, searchQuery, pageable));
}

服务方法调用 PagingAndSortingRepository 方法来根据这些参数(id、query、Pageable)返回一些值仅使用 searchByConferenceIdOrderByOrderNumber 方法。

@Repository
public interface SubmissionPageRepository extends PagingAndSortingRepository<SubmissionEntity, UUID> {
    Page<SubmissionEntity> searchByConferenceIdOrderByOrderNumber(Long conferenceId, Pageable pageable);
    Page<SubmissionEntity> findByConferenceIdAndContactsSurnameStartsWithIgnoreCase(Long conferenceId, String query, Pageable pageable);
}

错误不是很明显,但是当我尝试搜索(通过查询):“B”时,最终的元素数量为 number,比我通过“Be”搜索时要小,这怎么可能? 当我将 pageSize 的大小从 10(前端默认)增加到 100 时,错误消失了,那么最终的元素数量就是正确的。

我尝试使用 Postman 调用该方法

page: 0, size: 10, sort: orderNumber,ASC and query: "B"
如果我将查询更改为“Be”,则元素数会更小

我尝试将 pageSize 从 10 增加到 100,它成功了,但我希望每页有 10 个结果,而不是 100 个。

我认为,这可能是因为 PagingAndSortingRepository 处理实体的方式。

邮递员图片:

Postman GET request with query B

Postman GET request with query Be

原因:

在数据库中潜伏时,我删除了一些联系人,因此 1 次提交只有 1 个联系人,结果集现在是正确的。存储库的实现可以仅查看带有连接表的提交数量,该数量等于 pageSize,pageSize: 10 -> 存储库仅查看提交和联系人之间连接表中的前 10 行。

现在,如何解决这个问题?

修复

我必须在发送到数据库的 SQL 代码中添加

GROUP BY
子句,因为由 JPA 生成的 SQL 代码在这种设置下无法正常工作。

spring jpa spring-data-jpa paging jparepository
1个回答
0
投票

我在现有子句中添加了

GROUP BY
,作为自定义查询,发送到数据库,解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.