Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Exception IllegalArgumentException

Boa noite. Estava acompanhando o professor no vídeo, mas na hora de executar, ocorreu uma IllegalArgumentException. Tentei revisar mais não encontrei o erro.

public class RelatorioDeVendasVo {
    private String nomeProduto;
    private Integer quantidadeVendida;
    private LocalDate dataUltimaVenda;

    public RelatorioDeVendasVo(String nomeProduto, Integer quantidadeVendida, LocalDate dataUltimaVenda) {
        this.nomeProduto = nomeProduto;
        this.quantidadeVendida = quantidadeVendida;
        this.dataUltimaVenda = dataUltimaVenda;
    }

    public String getNomeProduto() {
        return nomeProduto;
    }

    public Integer getQuantidadeVendida() {
        return quantidadeVendida;
    }

    public LocalDate getDataUltimaVenda() {
        return dataUltimaVenda;
    }

    @Override
    public String toString() {
        return "RelatorioDeVendasVo{" +
                "nomeProduto='" + nomeProduto + '\'' +
                ", quantidadeVendida=" + quantidadeVendida +
                ", dataUltimaVenda=" + dataUltimaVenda +
                '}';
    }
}
    public RelatorioDeVendasVo relatorioDeVendas(){
        String jpql = "SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo( "
                + "produto.nome, "
                + "SUM(item.quantidade), "
                + "MAX(pedido.data)) "
                + "FROM Pedido pedido "
                + "JOIN pedido.itens item "
                + "JOIN item.produto produto "
                + "GROUP BY produto.name "
                + "ORDER BY item.quantidade DESC";
        return em.createQuery(jpql, RelatorioDeVendasVo.class).getSingleResult();

(Parte corrigida)Esta parte também estou em duvida. Fiz igual o professor mas minha IDE fala que esta errado.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSe tento corrigir com a IDE fica assim

        List<RelatorioDeVendasVo> relatorio = (List<RelatorioDeVendasVo>) pedidoDao.relatorioDeVendas();
        relatorio.forEach(System.out::println);

E da aquela IllegalArgumentException. Alguem pode me dar uma luz no que estou fazendo de errado ?

6 respostas

O erro acontece pq no seu código o método relatorioDeVendas() retorna um RelatorioDeVendasVo ao invés de um List, por isso ele diz que precisa do cast quando vc tenta atribuir o retorno do método relatorioDeVendas(que retorna um RelatorioDeVendasVo) para uma variavel do tipo List.

Modifique a função para retornar um List e substitua o getSingleResult() por getResultList();

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Obrigado isso passou totalmente despercebido por mim...

Agora esta parte compila sem problemas.

        List<RelatorioDeVendasVo> relatorio = pedidoDao.relatorioDeVendas();
        relatorio.forEach(System.out::println);

Mas o erro ainda persiste

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: data of: br.com.alura.loja.modelo.Pedido [SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo( produto.nome, SUM(item.quantidade), MAX(pedido.data)) FROM br.com.alura.loja.modelo.Pedido pedido JOIN pedido.itens item JOIN item.produto produto GROUP BY produto.name ORDER BY item.quantidade DESC]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:757)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:848)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
    at br.com.alura.loja.dao.PedidoDao.relatorioDeVendas(PedidoDao.java:40)
    at CadastroPedido.main(CadastroPedido.java:47)
Caused by: org.hibernate.QueryException: could not resolve property: data of: br.com.alura.loja.modelo.Pedido [SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo( produto.nome, SUM(item.quantidade), MAX(pedido.data)) FROM br.com.alura.loja.modelo.Pedido pedido JOIN pedido.itens item JOIN item.produto produto GROUP BY produto.name ORDER BY item.quantidade DESC]
    at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:112)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162)
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:636)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:748)
    ... 4 more
Caused by: org.hibernate.QueryException: could not resolve property: data of: br.com.alura.loja.modelo.Pedido
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:78)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:72)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:2053)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:412)
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:524)
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:723)
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:268)
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:208)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:1066)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1319)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.aggregateExpr(HqlSqlBaseWalker.java:3616)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.functionCall(HqlSqlBaseWalker.java:2894)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2418)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.constructor(HqlSqlBaseWalker.java:2698)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2405)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2275)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1534)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:611)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:339)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:287)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:276)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192)
    ... 10 more

Esse erro está dizendo que ele não conseguiu encontrar a variável data dentro da classe Pedido. Verifique se não faltou declarar ela, ou está com nome diferente.

Corrigi a parte da data estava com nome diferente na classe mesmo. So que agora da basicamente o mesmo erro so que em vez de "data" é "name"

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: name of: br.com.alura.loja.modelo.Produto [SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo( produto.nome, SUM(item.quantidade), MAX(pedido.data)) FROM br.com.alura.loja.modelo.Pedido pedido JOIN pedido.itens item JOIN item.produto produto GROUP BY produto.name ORDER BY item.quantidade DESC]

Tentei ver cada um para ver se tinha outro erro parecido mas não há.

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

O erro está acontecendo pq o Produto não tem a propriedade name. Na JPQL vc acessa apropriedade nome em 2 momentos, e no seu código, em 1 deles você usa name ao invés de nome. Substitua por nome em ambos.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Obrigado pela ajuda