cuốn sách gpt4 ai đã làm

java - phân trang nhiều kho lưu trữ

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:45:24 25 4
mua khóa gpt4 Nike

Tôi có hai lớp: A, B. Đối với mỗi lớp tôi có kho lưu trữ. Tôi muốn hiển thị dữ liệu trong một bảng (giao diện người dùng, đại loại như: http://embed.plnkr.co/V06RsBy4a6fShwmZcUEF/ ). Tôi muốn phân trang phía máy chủ.

Danh sách result = new ArrayList();
result.addAll(repoA.findAll());
result.addAll(repoB.findAll());

giao diện công cộng repoAPaginationRepository mở rộng PagingAndSortingRepository {
Trang findAll(Trang có thể phân trangYêu cầu);
}

giao diện công cộng repoAPaginationRepository mở rộng PagingAndSortingRepository {
Trang findAll(Trang có thể phân trangYêu cầu);
}

Có đủ để thêm "số lượng" của cả hai kho không? Ví dụ: Kho A: 100 dự án, Kho B: 50 dự án. Tổng cộng: 150 mục Tôi muốn hiển thị 50 mục trên mỗi trang.

câu trả lời hay nhất

Như bạn đã nói, số lượng sẽ chính xác. Bạn cần tìm cách hiển thị dữ liệu đã hợp nhất một cách chính xác. Chúng tôi có thể thấy rằng kho lưu trữ của bạn sắp xếp các bản ghi theo loại. Tuy nhiên, nếu bạn ghép các kết quả lại, chúng sẽ không được sắp xếp.

Trong ví dụ của bạn, giả sử repoA.findAll() trở lại [7,8,9]repoB.findAll()trở lại[1, 100],kết quả[7,8,9,1,100]sẽ không được sắp xếp chính xác. Giải pháp bạn cần tùy thuộc vào việc nguồn dữ liệu (cơ sở dữ liệu) của bạn có hỗ trợ toán tử UNION hay không

Sử dụng công đoàn

JPA không thể làm điều này (Hoạt động công đoàn) .Nhưng nếu cơ sở dữ liệu của bạn cung cấp mộtuniontoán tử (ví dụ: SQL hoặc mongoDB), bạn có thể sử dụng nó để lấy id của bản ghi dựa trên việc sắp xếp, sau đó lấy bản ghi dựa trên id thông qua JPA.

không có công đoàn

Nếu cơ sở dữ liệu của bạn không được cung cấp, để thực hiện việc này, bạn cần tạo kho lưu trữ thứ ba, kho này phải được tải xuống từ repoA Đang tải 50 mục, có tính đến aOffset và 50 repoB Các dự án cần xem xét trong bOffset, sau đó sắp xếp 100 trong số chúng (sắp xếp hợp nhất phải nhanh, bạn có thể dừng thuật toán ở mức 50).

Mã trông như thế này

giao diện RepoA {
Phân trang danh sách(int count, int offset, SortCriteria SortCriteria);
}

giao diện RepoB {
Phân trang danh sách(int count, int offset, SortCriteria SortCriteria);
}

lớp RepoAB {
repoA repo riêng tư;
repoB riêng tư repoB;


Phân trang danh sách (int count, int offset, SortCriteria SortCriteria) {
int aOffset = count == 0 ? 0 : calcAOffset(offset, SortCriteria);
int bOffset = count == 0 ? 0 : offset - aOffset;
trả về mergeSort(
repoA.paginate(đếm, aOffset),
repoB.paginate(đếm, bOffset),
Tiêu chí sắp xếp Tiêu chí sắp xếp,
50
)
}

Hợp nhất danh sáchSort(Danh sách aList, Danh sách bList, SortCriteria SortCriteia, int stopAt) {
...
}

int calcAOffset (int offset, SortCriteria SortCriteria) {
// Việc triển khai này có thể rất nặng nề, nó sẽ đếm tất cả các bản ghi
// đã xuất hiện ở các trang trước.
// Bạn có thể tránh được phép tính này bằng cách biết giá trị offset sử dụng bản ghi cuối cùng
// ở trang trước.
trả về phân trang(offset, 0, SortCriteria).filter(x => x instanceOf A).length
}
}

Về java - phân trang nhiều kho lưu trữ, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/54723060/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress