Я использую спящий режим и API критериев JPA и пытаюсь создать повторно используемый служебный метод, чтобы определить, сколько строк будет возвращено запросом.
В настоящее время у меня есть это:
Long countResults(CriteriaQuery cq, String alias){
CriteriaBuilder cb = em().getCriteriaBuilder();
CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
Root ent = countQuery.from(cq.getResultType());
ent.alias(alias);
countQuery.select(cb.count(ent));
Predicate restriction = cq.getRestriction();
if(restriction != null){
countQuery.where(restriction);
}
return em().createQuery(countQuery).getSingleResult();
}
Который я использую так:
CriteriaBuilder cb = em().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(modelClass());
root.alias("ct");
cq.select(root);
TypedQuery<User> query = em().createQuery(cq);
long count = countResults(cq, "ct");
И это прекрасно работает. Однако, когда я использую более сложный запрос, например
Join<UserThing, Thing> j = root.join(User_.things).join(UserThing_.thing);
cq.where(somePredicate);
Мой вызов countResults()
приводит к таким исключениям, как org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'myAlias.name'
, <AST>:0:0: unexpected end of subtree
, left-hand operand of a binary operator was null
Я предполагаю, что это как-то связано с объединением, и что мне нужно как-то связать это, но пока я не добился никакого успеха.
Помощь?