2013-04-18 33 views
14

Tôi có một bảng đệ trình có ID, Tên, Mã trong số các thuộc tính khác. Yêu cầu của tôi là tìm kiếm các bản ghi dựa trên các thuộc tính được đề cập và trả lại một tập hợp được phân trang.Truy vấn JPA để chọn dựa trên tiêu chí cùng với việc phân trang

Đây là giả cho những gì tôi đang tìm kiếm

searchSubmission(searchFilter sf,pageIndex,noOfRecords) 
{ 
    query = 'from submisssion where code=sf.code or id=sf.id order by id start_from (pageIndex*noOfRecords) limit noOfRecords' 
    return result(); 

} 

Dường như có rất nhiều lựa chọn: CriteriaBuilder, NamedQuery vv .. đó là một trong những hiệu quả trong tình huống này?

Trả lời

32

Đối với tất cả đối tượng truy vấn JPA (ngoại trừ truy vấn SQL gốc), bạn sẽ sử dụng phân trang thông qua phương thức setMaxResults (int) và setFirstResult (int). Ví dụ:

return em.createNamedQuery("yourqueryname", YourEntity.class) 
     .setMaxResults(noOfRecords) 
     .setFirstResult(pageIndex * noOfRecords)); 
     .getResultList(); 

JPA sẽ thực hiện phân trang cho bạn.

Truy vấn được đặt tên chỉ được xác định trước và có thể được lưu trong bộ nhớ cache, trong khi các loại khác được tạo động.
Vì vậy, sự lựa chọn là sử dụng JPQL như:

Query query = em.createQuery("SELECT s FROM Submission s WHERE s.code = :code or s.id = :id ORDER BY s.id", Submission.class); 

Hoặc CriteriaBuilder api để tạo thành một truy vấn tương tự:

CriteriaBuilder qb = em.getCriteriaBuilder(); 
    CriteriaQuery<Submission> cq = qb.createQuery(Submission.class); 

    Root<Submission> root = cq.from(Submission.class); 
    cq.where(qb.or( 
     qb.equal(root.get("code"), qb.parameter(String.class, "code")), 
     qb.equal(root.get("id"), qb.parameter(Integer.class, "id")) 
    )); 
    Query query = em.createQuery(cq); 

Đừng quên để thiết lập các giá trị tham số sử dụng query.setParameter ("id ", sf.id) chẳng hạn.

1

Bạn có thể sử dụng Pageable trong phương pháp kho

@Repository 
public interface StateRepository extends JpaRepository<State, Serializable> { 

@Query("select state from State state where state.stateId.stateCode = ?1") 
public State findStateByCode(String code, Pageable pageable); 

}

Và trong lớp dịch vụ, bạn có thể tạo ra các đối tượng Pageable:

@Autowire 
StateRepository stateRepository; 

public State findStateServiceByCode(String code, int page, int size) { 
    Pageable pageable = new PageRequest(page, size); 
    Page<Order> statePage = stateRepository.findStateByCode(code, pageable); 
    return statePage.getContent(); 
}