사용자가 여러 조건 (eq, ne, gt, lt 등)을 사용하여 해당 엔티티를 검색 할 수 있도록 내 시스템의 엔티티에 대해 "고급 검색" 이 엔티티의 속성. JPA의 Criteria API를 사용하여 Criteria 쿼리를 동적으로 생성 한 다음 setFirstResult()
& setMaxResults()
을 사용하여 페이지 매김을 지원합니다. 이 시점까지는 모두 좋았지 만 지금은 결과 그리드에서 총 결과 수를 보여주고 싶지만 Criteria 쿼리의 총 수를 얻는 간단한 방법은 없습니다. 내 코드가 어떻게 보이는지
이입니다JPA를 사용하는 페이지 매김에 대한 총 행 개수 기준 API
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();
내 결과 집합 그래서 나는 카운트 쿼리에 대한 나의 실체를로드하지 않으 큰 수, 등등 rowCount()
방법처럼 총 수를 얻기 위해 나에게 효율적인 방법을 말할 수 Criteria (나는 Hibernate의 Criteria에 있다고 생각한다).
'em.createQuery (cq);를 정확히 추가해야하는 이유를 알 수 있었습니까? 고마워요 – Ittai
이봐, 이건 내가 필요한 것 뿐이야. 왜이 줄이 필요한지 알고 싶다. –
"Predicate"가이 부분의'Root from = cQuery.from (Brand.class); 부분에서'Root <>'를 사용하여 만들어지고 두 가지 모두에 사용된다는 사실과 관련이 있다고 생각합니다. 카운트 쿼리 및 페이징 된 쿼리 AFAIK 당신은'Root <>'객체를 사용하여 술어를 두 번 빌드해야합니다. 두 번째 것은이 줄에 숨겨져있다.'cq.select (builder.count (cq.from (Brand.class))); 왜 정확히'em.createQuery (cq);가 작동하는지 모르겠다. IMO는 예외를 throw해야한다. –
Neilos