JPA 2 + Criteria API - Определение подзапроса

Я пока безуспешно пытаюсь преобразовать sql-запрос в Criteria API. Я могу создать два отдельных запроса, которые возвращают нужные мне значения, но я не знаю, как объединить их в один запрос.

Вот инструкция sql, которая работает:

select company.*, ticketcount.counter from company
    join 
(select company, COUNT(*) as counter from ticket where state<16 group by company) ticketcount
on company.compid = ticketcount.company;

Этот запрос Criteria возвращает результаты внутреннего запроса:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<intCompany> qTicket = cb.createQuery(intCompany.class);
Root<Ticket> from = qTicket.from(Ticket.class);
Path groupBy = from.get("company");        
Predicate state = cb.notEqual(from.<State>get("state"), getStateById(16));        
qTicket.select(cb.construct(
    intCompany.class, cb.count(from),from.<Company>get("company")))
        .where(state).groupBy(groupBy);                
em.createQuery(qTicket).getResultList();

В приложении я определил небольшой класс оболочки / помощника:

public  class intCompany{
    public Company comp;
    public Long opentickets;
    public intCompany(Long opentickets,Company comp){
        this.comp = comp;
        this.opentickets = opentickets;
    }
    public intCompany(){

    }
}

Кто-нибудь знает, как получить это работает?

Обновление

Спасибо. Я изменил свой критерий запроса, как вы предложили. Мне просто нужно было добавить цикл в конце, чтобы получить нужную мне информацию.

List<intCompany> result = em.createQuery(cq).getResultList();
List<Company> cresult = new ArrayList();
    for(intCompany ic: result){
        ic.comp.setOpentickets(ic.opentickets.intValue());
        cresult.add(ic.comp);
    }
return cresult;

Возможно, просто невозможно преобразовать исходный sql в Criteria API.

Другое обновление

Я понял, что мне нужно изменить исходное выражение sql на

select company.*, ticketcount.counter from company
    left join 
(select company, COUNT(*) as counter from ticket where state<16 group by company) ticketcount
on company.compid = ticketcount.company;

. В противном случае я не получу компании без записей в таблице заявок.

Есть ли другие предложения?

5
задан Thaddel 16 January 2012 в 11:00
поделиться