¿Como crear una consulta personalizada usando JPA?

publicado por: Anonymous

estoy migrando una aplicacion de Java Swing a JavaFX y por favor si alguien pudiese ayudarme a lo siguiente:

Uso base de datos PostgreSQL.

En SQL nativo tengo ésta consulta que funciona perfecto:

SELECT count(t.idremision) as entregados, COUNT(*)-count(t.idremision) as pendientes, 
e.identrada, c.nombrecliente, ciu.nombreciudad, e.lote, e.fecharecepcion::date, e.fecharegistrado,
e.contrato, e.representante FROM transformador t
LEFT JOIN despacho d ON d.iddespacho=t.iddespacho
LEFT JOIN remision r ON r.idremision=t.idremision
INNER JOIN entrada e ON e.identrada=t.identrada
INNER JOIN cliente c ON c.idcliente=e.idcliente
INNER JOIN ciudad ciu ON e.idciudad = ciu.idciudad
GROUP BY c.idcliente, ciu.idciudad, e.identrada
ORDER BY fecharecepcion DESC;

Modelo Entidad relación

Como podrán ver, por cada registro en la tabla entrada generalmente hay mas de un registro en la tabla transformador asociado…

Ejemplo:

Entrada 1 -> Total 20 …. resto de columnas de la tabla entrada y las otras asociadas…

Entrada 2 -> Total 15 …. resto de columnas de la tabla entrada y las otras asociadas…

Entrada 3 -> Total 130 …. resto de columnas de la tabla entrada y las otras asociadas…

Hay una columna llamada idremision que se le hace un UPDATE cuando el transformador se entrega, y no todos se entregan al mismo tiempo, es decir que ésa columna puede ser 0 o mayor que 0 . Es 0(cero) cuando no se ha entregado, y es mayor a 0(cero) cuando se le asigna el ID de una factura desde otra tabla…

Yo lo que necesito es éste mismo resultado que muestro en la imagen:

introducir la descripción de la imagen aquí

pero sin SQL nativo si es posible, sólo con JPA o JPQL nosé exactamente muy bien.

Por defecto JPA me creó una clase con éste codigo:

private List<Entrada> findEntradaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery cq = cb.createQuery();
            cq.select(cq.from(Entrada.class)).orderBy(cb.desc(cq.from(Entrada.class).get("fecharecepcion")));            
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

Aunque necesita ordenar por fecha y me tocó añadir ésta parte que no estaba:

cq.select(cq.from(Entrada.class)).orderBy(cb.desc(cq.from(Entrada.class).get("fecharecepcion")));

Espero por favor me puedan ayudar a como crear ésta misma consulta de alguna forma con JPA, o JPQL, no entiendo muy bien éste framework, hasta ahora estoy empezando. Si alguno me puede asesorar y aconsejarme usar otro metodo para realizar consultas a base de datos lo agradeceré…

solución

Puedes hacerlo escribiendo tu consulta en String, teniendo tu consulta en ese String puedes llamarla con createNativeQuery, puedes mandarlos parámetros que tienes solo tienes que concatenarlos donde tengas tu where, como este ejemplo que te dejo con tus datos:

private List<Entrada> findEntradaEntities(boolean all, int maxResults, 
int firstResult){
    EntityManager em = getEntityManager();

String queryStringBaseAll = "SELECT count(t.idremision) as entregados, COUNT(*)-  
count(t.idremision) as pendientes, 
e.identrada, c.nombrecliente, ciu.nombreciudad, 
e.lote, e.fecharecepcion::date, e.fecharegistrado,
e.contrato, e.representante FROM transformador t
LEFT JOIN despacho d ON d.iddespacho=t.iddespacho
LEFT JOIN remision r ON r.idremision=t.idremision
INNER JOIN entrada e ON e.identrada=t.identrada
INNER JOIN cliente c ON c.idcliente=e.idcliente
INNER JOIN ciudad ciu ON e.idciudad = ciu.idciudad
GROUP BY c.idcliente, ciu.idciudad, e.identrada
ORDER BY fecharecepcion DESC ";

List<Entrada> listEntradas = null;
    try {

        listEntradas = em.createNativeQuery(queryStringBaseAll, 
     Entrada.class)
                .getResultList();
    } catch (Exception ex) {

    }

    if (listEntradas  == null) {
        listEntradas  = new ArrayList<>();
    }

    return listEntradas ;

}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *