How to play query with MySQL subqueries in hibernate?

Question:

I'm using JPA 2.0 and trying to reproduce this query in hibernate, but I can't see how to do it.

I did it in MySQL language

SELECT totalassociado, 
       totalcriticado, 
       items.item_codigo_item, 
       items.item_data_item, 
       items.item_descricao, 
       items.item_status, 
       items.empresa, 
       items.usuario_nome, 
       Associado.usuario_codigo, 
       items.usuario_codigo 
FROM   (SELECT Count(item.`codigo`)          AS TotalAssociado, 
               item.`codigo_item`            AS item_codigo_item, 
               item.`data_item`              AS item_data_item, 
               item.`descricao`              AS item_descricao, 
               item.`status`                 AS item_status, 
               item.codigo_empresa, 
               usuario.`codigo`              AS usuario_codigo, 
               usuario.`nome`                AS usuario_nome, 
               usuario.`permissao`           AS usuario_permissao, 
               tecnico_item.`codigo_tecnico` AS tecnico_item_codigo_tecnico, 
               tecnico_item.`codigo_item`    AS tecnico_item_codigo_item 
        FROM   `item` item 
               INNER JOIN `tecnico_item` tecnico_item 
                       ON item.`codigo` = tecnico_item.`codigo_item` 
               INNER JOIN `usuario` usuario 
                       ON tecnico_item.`codigo_tecnico` = usuario.`codigo` 
        GROUP  BY usuario.codigo, 
                  item.codigo_empresa) AS Associado, 
       (SELECT Count(item.`codigo`)          AS TotalCriticado, 
               item.`codigo_item`            AS item_codigo_item, 
               item.`data_item`              AS item_data_item, 
               item.`descricao`              AS item_descricao, 
               item.`status`                 AS item_status, 
               usuario.`codigo`              AS usuario_codigo, 
               usuario.`nome`                AS usuario_nome, 
               usuario.`permissao`           AS usuario_permissao, 
               tecnico_item.`codigo_tecnico` AS tecnico_item_codigo_tecnico, 
               tecnico_item.`codigo_item`    AS tecnico_item_codigo_item 
        FROM   `item` item 
               JOIN `tecnico_item` tecnico_item 
                 ON item.`codigo` = tecnico_item.`codigo_item` 
               JOIN `usuario` usuario 
                 ON tecnico_item.`codigo_tecnico` = usuario.`codigo` 
        WHERE  item.status = 'CRITICADO') AS Criticado, 
       (SELECT item.`codigo`                 AS item_codigo, 
               item.`codigo_item`            AS item_codigo_item, 
               item.`data_item`              AS item_data_item, 
               item.`descricao`              AS item_descricao, 
               item.`status`                 AS item_status, 
               item.codigo_empresa           AS Empresa, 
               usuario.`codigo`              AS usuario_codigo, 
               usuario.`nome`                AS usuario_nome, 
               usuario.`permissao`           AS usuario_permissao, 
               tecnico_item.`codigo_tecnico` AS tecnico_item_codigo_tecnico, 
               tecnico_item.`codigo_item`    AS tecnico_item_codigo_item 
        FROM   `item` item 
               JOIN `tecnico_item` tecnico_item 
                 ON item.`codigo` = tecnico_item.`codigo_item` 
               JOIN `usuario` usuario 
                 ON tecnico_item.`codigo_tecnico` = usuario.`codigo`) AS items 
WHERE  Associado.usuario_codigo = items.usuario_codigo     

Could anyone give an idea / help?

ainda não consegui fazer a complicação está justamente em passar para jpql ou hql na hora de utilizar a sintaxe comecei assim:Query query = manager
            .createQuery(
                    "select m,d from (select m from Item m left join  m.tecnicos t "
                            + "where (m.status ='CRITICADO' or m.status ='JUSTIFICADO') and t.codigo=:codigo ) as m,"
                            + "(select d from Item d join d.tecnicos t where t.codigo=:codigo) as d",
                    Object[].class).setParameter("codigo", 3L);

    List<Object[]> items = query.getResultList();
    System.out.println("---Impressão de Items----");
    int i = 0;
    for (Object[] item : items)
        System.out.println(++i + " ITem  : "
                + ((Item) item[0]).getDescricao() + "Quantidade ===>  "
                + ((Item) item[1]).getDescricao());
}e recebi a mensagem:2014-03-21 11:46:25,161 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] line 1:17: unexpected token: m

2014-03-21 11:46:25,162 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] line 1:17: unexpected token: m line 1:17: unexpected token: m or ( unmapping m

Answer:

You can use HQL (Hibernate Query Language) for this purpose – HQL has a syntax very close to SQL and also supports sub-query's:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-subqueries

Still, in HQL you will have to make some adaptations, such as:

  • Join syntax ;
  • Change the name of the tables to the full name of the Pojo classes (remove the delimiters / backquote);
  • The columns listed in the WHERE clause and that are mapped as a foreign-key must receive the respective POJO classes as parameters;
Scroll to Top