Intento convertir una consulta sql a API de Criteria sin éxito hasta el momento. Puedo crear dos consultas separadas que devuelvan los valores que necesito, pero no sé cómo combinarlos en una sola consulta.API de criterios JPA 2 +: definición de una subconsulta
Aquí está la instrucción SQL que trabaja:
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;
Esta consulta Criterios devuelve los resultados de la consulta interna:
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();
En la aplicación definí una pequeña clase de contenedor/ayudante:
public class intCompany{
public Company comp;
public Long opentickets;
public intCompany(Long opentickets,Company comp){
this.comp = comp;
this.opentickets = opentickets;
}
public intCompany(){
}
}
Entonces, ¿alguien tiene una idea de cómo hacerlo funcionar?
actualización
Gracias. Cambié mi consulta de criterio como sugirió. Solo tuve que agregar un bucle al final para obtener la información que quería.
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;
Tal vez simplemente no es posible convertir el sql original a API Criteria.
Otra actualización
me di cuenta de que tenía que cambiar la expresión SQL original al
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;
De lo contrario no consigo empresas sin entradas en la tabla de entradas.
¿Hay alguna otra sugerencia?