2012-04-13 15 views
7

Tôi xin lỗi vì đã đặt câu hỏi này nếu có ai đó đã hỏi và hỏi một câu hỏi có lẽ câm nhưng tôi mới làm điều này và bạn là chuyên gia và tôi rất thích học hỏi từ chuyên gia của bạn và kinh nghiệm.Ghép trang Jpa với các số và tiếp theo, trước

Tôi muốn thêm phân trang vào một ứng dụng hiển thị 200 bản ghi trên mỗi trang. Phần cuối của trang phải có số. Nếu có 1050, trang đầu tiên sẽ hiển thị 100 và cuối trang sẽ hiển thị số 1,2,3,4,5 & 6.

Logic chung để thực hiện điều này là gì? Tôi biết rằng cơ sở dữ liệu phải chọn 200 lần và tôi phải theo dõi hồ sơ đầu tiên.

  1. Có cách nào để biết số lượng bản ghi sẽ được trả lại để tôi có thể biết số lượng hiển thị ở cuối trang? Nó có yêu cầu chọn một câu lệnh count() hay cái gì khác không?
  2. Đối với bản ghi 1050, các số 1,2,3,4,5 & 6 sẽ hiển thị và nhấp vào mỗi số yêu cầu cuộc gọi đến máy chủ. Có cách nào để biết có bao nhiêu hồ sơ sẽ được trả lại trong cuộc gọi tiếp theo tới máy chủ? Nó có yêu cầu chọn một câu lệnh count() hay cái gì khác không?
+0

Cảm ơn mọi người đã dành thời gian trả lời câu hỏi của tôi. Tôi sẽ cập nhật mã của tôi và sẽ cho bạn biết nếu tôi có thêm câu hỏi về điều này. – javafun

Trả lời

6

Bạn có thể sử dụng JPA Criteria API để thực hiện việc này. Giả sử TypedQuery, bạn sẽ sử dụng setFirstResultsetLastResult để giới hạn các bản ghi được trả lại từ cơ sở dữ liệu. Tất nhiên giá trị của các phương thức này sẽ phụ thuộc vào trang nào được yêu cầu và số lượng bản ghi được hiển thị trên mỗi trang.

first = (page - 1) * page size; 
last = (page * size) - 1; 

Lưu ý: Giả sử trang đầu tiên là 1 (ngược với 0).

Để nhận số bản ghi, bạn thực hiện truy vấn Tiêu chí chuẩn. Ví dụ:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class); 
countQuery.select(builder.count(countQuery.from(MyEntity.class))); 
final Long count = entityManager.createQuery(countQuery) 
     .getSingleResult(); 

Bạn cũng có thể tùy chỉnh mã ở trên để thực hiện đếm tương ứng với truy vấn khác. Cuối cùng, bạn cần một số cách để giao tiếp tổng số trở lại cho khách hàng. Một cách để làm điều này là gói kết quả tập hợp truy vấn của bạn trong một đối tượng khác có chứa thuộc tính cho số, hoặc trả về đối tượng được cho là kết quả của cuộc gọi DAO của bạn. Hoặc cách khác, bạn có thể lưu trữ thuộc tính count trong một đối tượng trong phạm vi yêu cầu của bạn.

public class ResultListWrapper<T> { 
    private Long count; 
    private Collection<T> results; 

    // constructor, getters, setters 
} 
+0

Cảm ơn bạn! – javafun

0

Có, bạn phải chọn số lượng trước khi tự nhận các hàng.

2

Bạn thường sẽ thực hiện cùng một truy vấn ngoại trừ việc sử dụng số trong danh sách lựa chọn thay vì các cột trước khi chạy truy vấn thực tế để tìm số lượng trang có. Bắt một trang cụ thể trong chế độ ngủ đông sau đó có thể được thực hiện với một cái gì đó như:

int maxRecords = // page size ... 
int startRow = // page number * page size 
Query query = session.createQuery('...'); 
query.setMaxResults(maxRecords); 
query.setFirstResult(startRow); 

Nếu thực hiện các truy vấn thêm là quá đắt phẫu thuật sau đó bạn có thể xem xét chỉ cung cấp liên kết tiếp theo/trước hoặc cung cấp cách khác trang thêm khi cần thiết (ví dụ như Khi dữ liệu được tải cuối cùng được xem) qua ajax.

Để hiển thị kết quả được phân trang bao gồm hiển thị liên kết số trang, tôi sẽ đề xuất (giả sử bạn đang sử dụng trang jsp để hiển thị dữ liệu này) bằng cách sử dụng thư viện thẻ JSP display tag. Thẻ hiển thị xử lý phân trang và sắp xếp hiển thị dữ liệu dạng bảng giả sử bạn có thể đưa nó vào JSP.

+0

Cảm ơn sự giúp đỡ của bạn! – javafun

0

Hãy xem Spring Data JPA. Về cơ bản nó hoạt động như thế nào Nhận thức được đề xuất trước đó, chỉ là bạn không phải làm điều đó, khung làm việc đó cho bạn. Bạn nhận được phân trang và sắp xếp theo mặc định (bạn vẫn cần phải tự lọc nếu bạn không muốn sử dụng Query DSL).

Họ có video 1h trên trang chính hiển thị phần giới thiệu nhanh, nhưng bạn sẽ chỉ cần xem khoảng 15 phút để có ý tưởng về id nào.