Cerco di convertire una query sql in API Criteria senza esito positivo finora. Posso creare due query separate che restituiscono i valori che mi servono, ma non so come combinarli in una singola query.API Criteri JPA 2 + - Definizione di una sottoquery
Ecco la dichiarazione di sql che funziona:
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;
Questa query criteri restituisce i risultati della query interne:
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();
Nell'applicazione ho definito una piccola classe wrapper/helper:
public class intCompany{
public Company comp;
public Long opentickets;
public intCompany(Long opentickets,Company comp){
this.comp = comp;
this.opentickets = opentickets;
}
public intCompany(){
}
}
Così qualcuno ha un'idea di come farlo funzionare?
Aggiornamento
Grazie. Ho modificato la mia query sui criteri come suggerito. Ho solo dovuto aggiungere un loop alla fine per ottenere le informazioni che volevo.
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;
forse è solo non è possibile convertire lo SQL originale per Criteri API.
Un altro aggiornamento
ho capito che dovevo cambiare l'espressione SQL originale per
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;
Altrimenti non ottengo le aziende senza voci nella tabella biglietto.
Quindi ci sono altri suggerimenti?