Я новичок в JPA и хочу реализовать общий JPA DAO, и мне нужно найти количество строк в наборе результатов запроса для реализации нумерации страниц. После поиска в Интернете я не могу найти практический способ сделать это. Вот код, предложенный во многих статьях:
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();
}
Однако этот код не работает при использовании join
. Можно ли подсчитать строки набора результатов запроса с помощью API критериев JPA?
ОБНОВЛЕНИЕ:
Вот код, который создает CriteriaQuery:
CriteriaQuery<T> queryDefinition = criteriaBuilder.createQuery(this.entityClass);
Root<T> root = queryDefinition.from(this.entityClass);
и некоторые объединения могут быть добавлены в корень, пока запрос не будет выполнен:
public Predicate addPredicate(Root<T> root) {
Predicate predicate = getEntityManager().getCriteriaBuilder().ge(root.join(Entity_.someList).get("id"), 13);
return predicate;
}
и сгенерированное исключение выглядит так:
org.hibernate.hql.ast.QuerySyntaxException: неверный путь:
'generateAlias1.id' [выберите количество (generateAlias0) из entity.Entity
как генерируемый Алиас0, где (генерированный Алиас0.id> = 13L) и (
(generateAlias1.id <= 34L))] </p>
, который генерировал Алиас1, должен быть в Entity, а генерируемый Алиас0 должен быть в ассоциации, к которой я присоединился.
Обратите внимание, что я правильно реализую Join, потому что когда я выполняю запрос без запроса count, он выполняется без ошибок, и Join работает правильно, но когда я пытаюсь выполнить запрос count, выдается исключение.