我有一個用戶端點,可以使用分頁按布林值對 MySQL 中的所有用戶進行排序,隨著數字不斷增長,我發現它正在跳過一些用戶并復制其他用戶這里是郵遞員中的一些螢屏截圖,其中用戶具有相同的 id ( 95 )在 2 個不同的頁面中復制
另外有時我無法在所有頁面中找到一些用戶
第2頁

第 3 頁

服務實作
@Override
public PagedResponse<?> findAll(UserPrincipal currentUser, int page, int size) {
AppUtils.validatePageNumberAndSize(page, size);
//return users with 'isBoard' true first
Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "isBoard");
if (currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))
|| currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_SUPER_ADMIN.toString()))) {
Page<MEUser> contentPage = userRepository.findAll(pageable);
List<MEUser> list = contentPage.getNumberOfElements() == 0 ? Collections.emptyList() : contentPage.getContent();
return new PagedResponse<>(list.stream()
.map(user -> mapToAllUsersDTO(user, new AllUserDTO()))
.collect(Collectors.toList()), contentPage.getNumber(), contentPage.getSize(), contentPage.getTotalElements(), contentPage.getTotalPages(), contentPage.isLast());
} else {
Page<MEUser> contentPage = userRepository.findByMemberTrue(pageable);
List<MEUser> list = contentPage.getNumberOfElements() == 0 ? Collections.emptyList() : contentPage.getContent();
return new PagedResponse<>(list.stream()
.map(user -> mapToAllUsersDTO(user, new AllUserDTO()))
.collect(Collectors.toList()), contentPage.getNumber(), contentPage.getSize(), contentPage.getTotalElements(), contentPage.getTotalPages(), contentPage.isLast());
}
}
uj5u.com熱心網友回復:
這是一個資料庫問題,而不是您的代碼。當一個有序欄位的多個行具有相同的值時,資料庫不能確保一致的結果。
使用分頁時LIMIT,OFFSET您必須提供具有唯一值的 order by 欄位,因此在您的情況下,您必須排序isBoard并id確保結果一致。
uj5u.com熱心網友回復:
這是因為 if 條件僅驗證 ADMIN 和 SUPER_USER。用戶 95 可能具有其他條件下的其他角色。請檢查一次并提供角色和用戶的資料庫資訊。
uj5u.com熱心網友回復:
我在分頁中添加了 id 條件:
Pageable pageable =
PageRequest.of(page, size, Sort.by("isBoard").descending().and(Sort.by("id")));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/336582.html
上一篇:Springjpahibernate如何將關系映射到同一物體的多個物件
下一篇:連接多個物體
