1
resposta

[Bug] Erro aplicando RelatorioDeVendasVo. Eu uso MSSql.

Ao aplicar a classe RelatorioDeVendasVo passou a falhar.

em PedidoDao.java:

public List<RelatorioDeVendasVo> relatorioDeVendas() {
        String jpql =  
                  "SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo("
                + "produto.nome, "
                + "SUM(item.quantidade) As Quantidade, "
                + "MAX(pedido.dataInclusao))"
                + "FROM Pedido pedido " 
                + "JOIN pedido.itens item " 
                + "JOIN item.produto produto "
                + "GROUP BY produto.nome " 
                + "ORDER BY Quantidade DESC";
        return em.createQuery(jpql, RelatorioDeVendasVo.class)
                .getResultList();
    }

Observaçao. Eu tive que colocar alias na coluna quantidade (SUM(item.quantidade) As Quantidade) pois nao rodava no MSSQL.

Falha ao executar:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.query.sqm.InterpretationException: Error interpreting query [SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo(produto.nome, SUM(item.quantidade) As Quantidade, MAX(pedido.dataInclusao))FROM Pedido pedido JOIN pedido.itens item JOIN item.produto produto GROUP BY produto.nome ORDER BY Quantidade DESC]; this may indicate a semantic (user query) problem or a bug in the parser at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:193) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:200) at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:666) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) at br.com.alura.loja.dao.PedidoDao.relatorioDeVendas(PedidoDao.java:44) at br.com.alura.loja.testes.CadastroDePedido.main(CadastroDePedido.java:47) Caused by: org.hibernate.query.sqm.InterpretationException: Error interpreting query [SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo(produto.nome, SUM(item.quantidade) As Quantidade, MAX(pedido.dataInclusao))FROM Pedido pedido JOIN pedido.itens item JOIN item.produto produto GROUP BY produto.nome ORDER BY Quantidade DESC]; this may indicate a semantic (user query) problem or a bug in the parser at org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:95) at org.hibernate.internal.AbstractSharedSessionContract.lambda$createQuery$1(AbstractSharedSessionContract.java:653) at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:123) at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:651)

1 resposta

Oii, Anselmo! Tudo bem?

O erro da exception indica que está na consulta HQDL e pelo que pude ver esse erro é de sintaxe, não se preocupe.

Há uma falta de "espaço em branco" na seguinte linha:

+ "MAX(pedido.dataInclusao))"

Troque para:

 + "MAX(pedido.dataInclusao)) "

O seu código completo ficará assim:

public List<RelatorioDeVendasVo> relatorioDeVendas() {
        String jpql =  
                  "SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo("
                + "produto.nome, "
                + "SUM(item.quantidade) As Quantidade, "
                + "MAX(pedido.dataInclusao)) "
                + "FROM Pedido pedido " 
                + "JOIN pedido.itens item " 
                + "JOIN item.produto produto "
                + "GROUP BY produto.nome " 
                + "ORDER BY Quantidade DESC";
        return em.createQuery(jpql, RelatorioDeVendasVo.class)
                .getResultList();
    }

Espero que dê certo. Continue interagindo no fórum compartilhando suas dúvidas, projetos e sugestões.

Bons estudos, Anselmo!