Tôi mới trong JPA và muốn triển khai một JPA DAO chung và cần tìm số hàng của một tập kết quả truy vấn để triển khai phân trang. Sau khi tìm kiếm trên web, tôi không thể tìm thấy cách thực tế để làm điều đó. Đây là mã được đề xuất trong nhiều bài viết:Làm thế nào để đếm số hàng của JPA 2 CriteriaQuery trong một JPA DAO chung?
public <T> Long findCountByCriteria(CriteriaQuery<?> criteria) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
Root<?> entityRoot = countCriteria.from(criteria.getResultType());
countCriteria.select(builder.count(entityRoot));
countCriteria.where(criteria.getRestriction());
return em.createQuery(countCriteria).getSingleResult();
}
Tuy nhiên, mã đó không hoạt động khi sử dụng join
. Có cách nào để đếm các hàng của tập hợp kết quả truy vấn bằng cách sử dụng API tiêu chí JPA không?
UPDATE: đây là mã mà tạo CriteriaQuery:
CriteriaQuery<T> queryDefinition = criteriaBuilder.createQuery(this.entityClass);
Root<T> root = queryDefinition.from(this.entityClass);
và một số tham gia có thể được thêm vào thư mục gốc đến khi truy vấn đã được thực hiện:
public Predicate addPredicate(Root<T> root) {
Predicate predicate = getEntityManager().getCriteriaBuilder().ge(root.join(Entity_.someList).get("id"), 13);
return predicate;
}
và ngoại lệ được tạo ra là như:
org.hibernate.hql.ast.QuerySyntaxException: Đường dẫn không hợp lệ: 'generatedAlias1.id' [select count (generatedAlias0) từ entity.Entity như generatedAlias0 nơi (generatedAlias0.id> = 13L) và ( (generatedAlias1.id < = 34L))]
mà generatedAlias1 nên được trên Entity và generatedAlias0 nên được trên các hiệp hội mà tôi tham gia vào đó. Lưu ý rằng tôi thực hiện Tham gia đúng cách vì khi tôi thực hiện truy vấn mà không tính truy vấn, nó thực hiện mà không có lỗi và tham gia hoạt động đúng nhưng khi tôi cố gắng thực hiện truy vấn đếm nó ném ngoại lệ.
Bạn có thể chỉ cho chúng tôi cách bạn đã xác định CriteriaQuery > tiêu chí – perissf
@perissf Tôi đã cập nhật bài đăng hay không. – stacker
Kiểm tra một số câu trả lời khác cho các vấn đề tương tự: http://stackoverflow.com/questions/9001289/jpa-hibernate-criteriabuilder-how-to-create-query-using-relationship-object/9002225#9002225 và http: // stackoverflow.com/questions/9025196/how-to-use-jpa-criteria-api-when-joining-many-tables/9025656#9025656 – perissf