2012-10-08 34 views
10

Tôi sử dụng PagingAndSortingRepository và phương thức findAll (Pageable pageable) để phân trang dữ liệu của tôi. Tôi nghĩ rằng không có cách nào để cung cấp bất kỳ điều kiện nào. Ví dụ đôi khi tôi muốn chọn địa chỉ và phân trang nơi thành phố = NY. Có cách nào để cung cấp điều kiện và phân trang đồng thời không?Làm cách nào để kết hợp phân trang với truy vấn tiêu chí trong JPA dữ liệu mùa xuân?

Trả lời

10

Các PagingAndSortingRepository chỉ cần thêm các phương pháp CRUD rất cơ bản trong chế độ phân trang. Khi mô tả reference documentation, bạn có thể chỉ cần thêm tham số Pageable vào bất kỳ phương thức truy vấn nào bạn xác định để đạt được phân trang của truy vấn này.

interface CustomerRepository implements Repository<Customer, Long> { 

    Page<Customer> findByLastname(String lastname, Pageable pageable); 

    List<Customer> findByFirstname(String firstname, Pageable pageable); 
} 

Phương pháp đầu tiên sẽ trả về một Page chứa siêu dữ liệu trang như tổng các yếu tố có sẵn vv Để tính toán dữ liệu này nó sẽ kích hoạt một truy vấn số bổ sung cho các truy vấn nguồn gốc. Phương thức truy vấn thứ hai trả về tập kết quả lát cắt đơn giản mà không có truy vấn đếm được thực hiện.

+0

Xin chào @Olivier with the Pageagle tôi không thấy nơi để chỉ định 'offset',' PageRequest' chỉ chấp nhận 'page' và' size'. tôi không thực sự thấy lý do tại sao tôi phải làm 'trang * kích thước' để có được' bù đắp' của tôi. có cách nào để sử dụng 'offset' trái ngược với' page' không? –

+1

Lý do 'PageRequest' cho thấy' page' và 'size' là chỉ' offset' là không đủ vì bạn vẫn cần 'size'. Khái niệm về phân trang thường ngụ ý một lượt xem trang tập trung vào dữ liệu, đó là những gì chúng tôi thể hiện ở đây. Nhưng không có gì ngăn cản bạn khỏi việc thực hiện của riêng bạn 'Pageable' mà làm việc với offsets và kích cỡ. –

+0

Cách chúng tôi có thể sử dụng Phân chia với API truy vấn? –

2

Đối Pagination bạn cần 2 phương pháp như getCount (pageable pageable) và FindAll (pageable pageable)

Bằng cách sử dụng chức năng này trong Hibernate, tuy nhiên, là tầm thường. Nếu bạn có bất kỳ truy vấn HQL bạn chỉ có thể làm điều này:

public Long getCount(Pageable pageable) { 
    Query q = session.createQuery("Select count(t) From TableClass t where t.city = 'NY'"); 
    Long cnt = (Long) q.uniqueResult(); 
    return cnt; 
} 

public List<TableClass> findAll(Pageable pageable) { 
    Query q = session.createQuery("From TableClass t where t.city = 'NY'"); 
    q.setFirstResult(start); 
    q.setMaxResults(length); 
    List<TableClass> tableClasslist = q.list(); 
    return tableClasslist; 
} 

Tương tự như vậy, nếu bạn có một truy vấn Tiêu chuẩn, đó là một cách hiệu quả điều tương tự:

public Long getCount(Pageable pageable) { 
    Criteria c = session.createCriteria(TableClass.class); 
    c.setProjection(Projections.rowCount()); 
    Long cnt = (Long) c.uniqueResult(); 
    return cnt; 
} 

public List<TableClass> findAll(Pageable pageable) { 
    Criteria c = session.createCriteria(TableClass.class); 
    c.setParameter("city","NY"); 
    c.setFirstResult(start); 
    c.setMaxResults(length); 
    List<TableClass> tableClasslist = c.list(); 
    return tableClasslist ; 
} 
+0

Cảm ơn bạn đã trợ giúp. Tôi đã tìm giải pháp JPA nhưng DataNucleus đã loại bỏ JPA khỏi các thẻ của câu hỏi. Tôi đã sử dụng thẻ ngủ đông để thể hiện rằng Hibernate là nhà cung cấp kiên trì của tôi. – Mariusz

Các vấn đề liên quan