2015-10-04 3 views
0

Я использую API критериев JPA2.1, где я создал объект результата с использованием конструкции строителя критериев.Как подсчитать результаты из пользовательского объекта с использованием JPA CriteriaQuery

Рассмотрим приведенный ниже образец кода.

CriteriaBuilder cb;//Assume cb is obtained here 
CriteriaQuery<Report> cq = cb.createQuery(Report.class);// custom selective Class 
Root<Student> root = cq.from(Student.class); 
Join<Student, XTable> join1 = root.join("xtable", JoinType.INNER); 
Join<Student, YTable> join1 = root.join("ytable", JoinType.INNER); 

Ниже приведена основная строка, где я бы выбрал.

cq.select(cb.construct(Report.class, 
     root.get("name"), join1.get("address_type"), join2.get("country"))); 

Теперь я хотел бы сделать подсчет на этой конструкции Report.

Я пробовал считать так.

cq.select(cb.count(cb.construct(......))); 
// Failed because count accepts Expression and I tried assigning the cb.construct to Expression which is not working. 

Как получить счет?

+0

Добавить более подробную информацию о классах сущностей и их отношений. Расскажите нам о классе 'CandidateReport': в чем его цель? Есть ли таблица db, представляющая его? Какова цель использования 'CriteriaQuery # getRestriction()', поскольку в 'cq' нет предложения' where'? – perissf

+0

Обновленный вопрос. – srk

+0

И почему вы показываете 2 вопроса, когда в вопросе говорится, что вам нужен только запрос на подсчет? – perissf

ответ

1

Я думаю, что это будет выглядеть примерно так:

Ваш код:

CriteriaBuilder cb;//Assume cb is obtained here 
CriteriaQuery<Report> cq = cb.createQuery(Report.class);// custom selective Class 
Root<Student> root = cq.from(Student.class); 
Join<Student, XTable> join1 = root.join("xtable", JoinType.INNER); 
Join<Student, YTable> join1 = root.join("ytable", JoinType.INNER); 
countItemsByCriteria(entityManagerReference, cq, cb); 


private <T> Long countItemsByCriteria(EntityManager em, CriteriaQuery<T> cqEntity, CriteriaBuilder cb) { 
    CriteriaBuilder builder = cb; 
    CriteriaQuery<Long> cqCount = builder.createQuery(Long.class); 
    Root<?> entityRoot = cqCount.from(cqEntity.getResultType()); 
    cqCount.select(builder.count(entityRoot)); 
    cqCount.where(cqEntity.getRestriction()); 
    return em.createQuery(cqCount).getSingleResult(); 
} 

Как также описано в этом посте: JPA + Hibernate count(*) using CriteriaBuilder - with generatedAlias