miércoles, 7 de marzo de 2012

[Java-JPA] Trabajar con consultas mezcladas

En JPA, habitualmente se trabaja con consultas que devuelven un único tipo de objeto, por ejemplo:
SELECT e FROM Equipo e
En estos casos es bastante sencillo trabajar, puesto que son resultados compactos, y a la hora de, por ejemplo, trabajar con informes de iReport, pasamos dichos objetos como tales. Sin embargo, a veces no queremos recuperar un único tipo de objeto sino varios, o incluso objetos y partes de otros. Por ejemplo, en este caso recuperamos equipos y los puestos cuya clave ajena está en equipo:
SELECT e, ep  FROM Equipo e JOIN e.puesto ep
En este caso, necesitamos extraer los distintos objetos recorriendo un resultset, y lo hacemos del siguiente modo:
    private void pruebaConsulta(String textoConsulta) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("upiPU");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        Query consulta = em.createQuery(textoConsulta);

        // Esto valdría para una consulta que devuelve:
        // un objeto Equipo en la primera columna
        // un objeto Puesto en la segunda
        List res = consulta.getResultList();
        for (int i = 0; i < res.size(); i++) {
            Object[] fila = (Object[]) res.get(i);
            Equipo e = (Equipo) fila[0];
            Puesto p = (Puesto) fila[1];
            System.out.print(e.getIdEquipo() + "\t");
            System.out.print(e.getCodGiss() + "\t");
            System.out.print(p.getIdPuesto() + "\t");
            System.out.println(p.getUsuario().getIdUsuario());
        }
    }
De este modo, entresacamos únicamente los atributos de los objetos que queremos, aunque también podríamos haberlos escogido en la consulta, en cuyo caso los objetos devueltos podrían ser de tipo Integer, String, o cualquiera de los que compongan cada uno de los campos.

Datos personales