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;