Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
16
respostas

Error java.lang.NullPointerException

Boa tarde, estou com um erro em uma simples consulta onde tenho uma classe Categoria e uma classe Produtos, onde eu posso ter uma categoria para cada produto (ManyToOne), e varios produtos em uma categoria (OneToMany) mas estou com erro de java.lang.NullPointerException

A consulta é pesquisar produtos em determinada categoria, onde a categoria é passada no construtor do método.

classe Produtos :

package br.com.rprvidros.models;

import java.math.BigDecimal;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Produtos {


    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String descricao;
    private String cor;
    private String codigo_alternativo;
    private Integer estoque_minimo;
    private Integer estoque_maximo;
    private String path;
    private BigDecimal preco;

    @ManyToOne
    private Categoria categoria;

classe ProdutoDao :

package br.com.rprvidros.daos;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.rprvidros.models.Produtos;

@Repository
@Transactional
public class ProdutoDao {

    @PersistenceContext
    private EntityManager manager;

    public List<Produtos> listar() {
        return manager.createQuery("select p from Produtos p").getResultList();
    }

    public List<Produtos> produtoCategoria(String categoria) {
        return manager.createQuery("select p from Produtos p"
                + " join p.categoria c where c.nome =" + categoria).getResultList();

    }
}

classe de teste:

package br.com.rprvidros.teste;

import java.util.List;

import br.com.rprvidros.daos.ProdutoDao;
import br.com.rprvidros.models.Produtos;

public class TestaCategoria {
    public static void main(String[] args) {

        List<Produtos> categoria = new ProdutoDao().produtoCategoria("Ferramentas");
        for (Produtos produtos : categoria) {
            System.out.println(produtos.getDescricao());
            System.out.println(produtos.getCor());
        }

    }
}

mas me retorna o erro, muito obrigado.

16 respostas

Qual erro é retornado, Gabriel?

Na classe ProdutoDao, no método produtoCategoria, adicione um espaço antes da última aspa da String.

c.nome = "

Manoel o erro é :

Exception in thread "main" java.lang.NullPointerException
    at br.com.rprvidros.daos.ProdutoDao.produtoCategoria(ProdutoDao.java:25)
    at br.com.rprvidros.teste.TestaCategoria.main(TestaCategoria.java:11)

Daniel coloquei o espaço mas o erro continua

Então testa se o resultado da consulta não é null.

Query query = manager.createQuery("select p from Produtos p"
                + " join p.categoria c where c.nome =" + categoria) 
if(query != null) {
...
}

Em último caso testa se o manager está sendo injetado

if(manager != null) {
...
}

Daniel ele nem chega a passar pelo if ele para na linha da query: Query query = manager.createQuery("select p from Produtos p")

tem alguma coisa errada, eu tenho um método que lista todos os produtos e manda para uma jsp ele funciona normal, mas agora nessa mesma classe de teste tentei executar o metodo, ele me retorna o mesmo erro na query, imagino que esteja faltando alguma configuração na classe

Então tenta assim:

public List<Produtos> produtoCategoria(String categoria) {
    return manager.createQuery("select p from Produtos p"
        + " where p.categoria.nome = " + categoria).getResultList();
}

Mesma coisa Daniel =(

Posta a classe Categoria.

segue ai:

package br.com.rprvidros.models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Categoria {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String nome;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

}

Adiciona aspas simples ao hql, assim:

public List<Produtos> produtoCategoria(String categoria) {
    return manager.createQuery("select p from Produtos p"
        + " where p.categoria.nome = '" + categoria + "'").getResultList();
}

Já havia tentando isso Daniel.

named parameters:

public List<Produtos> produtoCategoria(String categoria) {
    String hql = "select p from Produtos p where p.categoria.nome = :categoria";
    return manager.createQuery().setParameter("categoria", categoria).getResultList();
}

Mesma coisa daniel, se eu tento uma simples Query do tipo:

public List<Produtos> listar() {
        return manager.createQuery("select p from Produtos p").getResultList();
    }

ele me retorna o mesmo erro

solução!

O manager está sendo injetado?

o manager é injetado na classe ProdutoDao:

package br.com.rprvidros.daos;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.rprvidros.models.Produtos;

@Repository
@Transactional
public class ProdutoDao {

    @PersistenceContext
    private EntityManager manager;

    public List<Produtos> listar() {
        return manager.createQuery("select p from Produtos p").getResultList();
    }

    public List<Produtos> produtoCategoria(String categoria) {
        String hql = "select p from Produtos p where p.categoria.nome = :categoria";
        return manager.createQuery(hql).setParameter("categoria", categoria).getResultList();
    }
}