我有一致性问题,特别是在调用页面存储库方法时返回值。
我有一个控制器方法,它有参数:长会议 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 处理实体的方式。
邮递员图片:
原因:
在数据库中潜伏时,我删除了一些联系人,因此 1 次提交只有 1 个联系人,结果集现在是正确的。存储库的实现可以仅查看带有连接表的提交数量,该数量等于 pageSize,pageSize: 10 -> 存储库仅查看提交和联系人之间连接表中的前 10 行。
现在,如何解决这个问题?
修复
我必须在发送到数据库的 SQL 代码中添加
GROUP BY
子句,因为由 JPA 生成的 SQL 代码在这种设置下无法正常工作。
我在现有子句中添加了
GROUP BY
,作为自定义查询,发送到数据库,解决了这个问题。