Solucionado (ver solução)
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();
    }
}