Tôi đang triển khai loại chức năng "Tìm kiếm nâng cao" cho thực thể trong hệ thống của tôi. về các thuộc tính của thực thể này. Tôi đang sử dụng API tiêu chí của JPA để tạo động truy vấn Tiêu chí và sau đó sử dụng setFirstResult()
& setMaxResults()
để hỗ trợ phân trang. Tất cả là tốt cho đến thời điểm này nhưng bây giờ tôi muốn hiển thị tổng số kết quả trên lưới kết quả nhưng tôi không thấy một cách thẳng về phía trước để có được tổng số truy vấn Tiêu chí.
Đây là cách mã của tôi trông giống như:Tổng số hàng cho phân trang bằng cách sử dụng API tiêu chí JPA
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Brand> cQuery = builder.createQuery(Brand.class);
Root<Brand> from = cQuery.from(Brand.class);
CriteriaQuery<Brand> select = cQuery.select(from);
.
.
//Created many predicates and added to **Predicate[] pArray**
.
.
select.where(pArray);
// Added orderBy clause
TypedQuery typedQuery = em.createQuery(select);
typedQuery.setFirstResult(startIndex);
typedQuery.setMaxResults(pageSize);
List resultList = typedQuery.getResultList();
tập kết quả của tôi có thể là lớn vì vậy tôi không muốn tải thực thể của tôi cho truy vấn số, vì vậy cho tôi biết cách hiệu quả để có được tổng số như rowCount()
phương pháp trên Tiêu chí (Tôi nghĩ rằng nó có trong tiêu chuẩn Hibernate).
Bạn có thể tìm hiểu tại sao chính xác bạn cần thêm 'em.createQuery (cq);'? Cảm ơn – Ittai
Hey, đây chỉ là những gì tôi cần ... bu Tôi cũng muốn biết tại sao dòng này là cần thiết!? –
Tôi nghi ngờ nó là để làm với thực tế là 'Predicate' đang được xây dựng bằng cách sử dụng 'Root <>' từ phần này 'Root từ = cQuery.from (Brand.class);' và sau đó được sử dụng cho cả hai truy vấn đếm và truy vấn được phân trang. AFAIK bạn cần xây dựng các vị từ hai lần bằng cả hai đối tượng 'Root <>'. Cái thứ hai được ẩn trong dòng này 'cq.select (builder.count (cq.from (Brand.class))); Tại sao chính xác 'em.createQuery (cq);' công việc tôi không biết, IMO nó nên ném một ngoại lệ. –
Neilos