Я пытаюсь реализовать следующий удобный метод:JPA 2.0: количество для произвольного критерияQuery?
/**
* Counts the number of results of a search.
* @param criteria The criteria for the query.
* @return The number of results of the query.
*/
public int findCountByCriteria(CriteriaQuery<?> criteria);
В Hibernate, это делается
criteria.setProjection(Projections.rowCount());
Что эквивалентно выше в JPA? Я нашел множество простых примеров подсчета, но ни один из них не использовал CriteriaQuery, число строк которого должно быть определено.
EDIT:
Я, к сожалению, обнаружил, что @ ответ Паскаля не правильным. Проблема очень тонкая и показывает только при использовании присоединяется:
// Same query, but readable:
// SELECT *
// FROM Brain b
// WHERE b.iq = 170
CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Join<Object, Object> brainJoin = root.join("brain");
Predicate iqPredicate = cb.equal(brainJoin.<Integer>get("iq"), 170);
query.select(root).where(iqPredicate);
При вызове findCountByCriteria(query)
, оно умирает со следующим исключением:
org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.iq' [select count(generatedAlias0) from xxx.tests.person.dom.Person as generatedAlias0 where generatedAlias1.iq=170]
Есть ли другой способ обеспечить такой способ CountByCriteria
?
Где вы можете найти решение? Я нахожусь на том же узле и не знаю, как действовать дальше. Благодарю. – Ittai
@Ittai: Я уверен, что это невозможно. – blubb
@Ittai: Видимо, это возможно в конце концов. Пожалуйста, см. Ответ Хосе Луиса Мартина. Я не пробовал, но это похоже на истинное решение для меня. – blubb