[Resolvido] Dúvida namedquery

6 respostas
Z

Galera,
Estou com um problema estranho em uma namedquery que fiz.
Quando tento passar um parametro para ela tenho o seguinte erro:

[color=red]Parameter value [3] did not match expected type [br.com.unip.menudroidweb.model.GrupoProduto][/color]

A linha que da erro é a seguinte:
populateQueryParameters(query, parameters);
Estou setando o parametro da seguinte maneira:
parameters.put("grupoProduto", idGrupoProduto);
Já debuguei o código aqui e ele está mandando corretamente o valor do idGrupoProduto. Alguém saberia porque esse está ocorrendo?? Abaixo deixo as classes para referência.

Produto.java

package br.com.unip.menudroidweb.model;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "produto")
@XmlRootElement
@NamedQueries(value={
		@NamedQuery(name="Produto.buscarPorGrupoProduto", query="select p from Produto p where p.grupoProduto = :grupoProduto")		
})
public class Produto implements Serializable {

	private static final long serialVersionUID = 8836023087332514952L;
	
	public static final String PROCURAR_POR_GRUPO_PRODUTO = "Produto.buscarPorGrupoProduto";

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(unique = true, nullable = false)
	private int idProduto;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idGrupoProduto")
	private GrupoProduto grupoProduto;
	
	@Column(nullable = false, length = 150)
	private String descricao;

	@Column(nullable = true, length = 300)
	private String observacaoCardapio;

	@Column(nullable = false, precision = 10, scale = 2)
	private BigDecimal precoCusto;

	@Column(nullable = false, precision = 10, scale = 2)
	private BigDecimal precoVenda;
	
	public int getIdProduto() {
		return this.idProduto;
	}

	public void setIdProduto(int idProduto) {
		this.idProduto = idProduto;
	}

	public String getDescricao() {
		return this.descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getObservacaoCardapio() {
		return this.observacaoCardapio;
	}

	public void setObservacaoCardapio(String observacaoCardapio) {
		this.observacaoCardapio = observacaoCardapio;
	}

	public BigDecimal getPrecoCusto() {
		return this.precoCusto;
	}

	public void setPrecoCusto(BigDecimal precoCusto) {
		this.precoCusto = precoCusto;
	}

	public BigDecimal getPrecoVenda() {
		return this.precoVenda;
	}

	public void setPrecoVenda(BigDecimal precoVenda) {
		this.precoVenda = precoVenda;
	}
	
	public GrupoProduto getGrupoProduto() {
		if (grupoProduto == null) {
			grupoProduto = new GrupoProduto();
			
		}

		return grupoProduto;
	}

	public void setGrupoProduto(GrupoProduto grupoProduto) {
		this.grupoProduto = grupoProduto;
	}

}

ProdutoDAO.java

package br.com.unip.menudroidweb.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.com.unip.menudroidweb.model.Produto;

public class ProdutoDAO extends DAOFactory<Produto>{
	private static final long serialVersionUID = -2176679123609120020L;

	public ProdutoDAO() {
		super(Produto.class);
	}
	
	public List<Produto> findProdutoByGrupoProduto(int idGrupoProduto){
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("grupoProduto", idGrupoProduto);     
        return super.findManyResult(Produto.PROCURAR_POR_GRUPO_PRODUTO, parameters);
    }
}

DAOFactory.java

package br.com.unip.menudroidweb.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;

import br.com.unip.menudroidweb.model.GrupoProduto;

abstract class DAOFactory<T> implements Serializable {
	private static final long serialVersionUID = 1L;

	private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("menudroidweb");
	private EntityManager em;

	private Class<T> entityClass;

	public void beginTransaction() {
		em = emf.createEntityManager();

		em.getTransaction().begin();
	}

	public void commit() {
		em.getTransaction().commit();
	}

	public void rollback() {
		em.getTransaction().rollback();
	}

	public void closeTransaction() {
		em.close();
	}

	public void commitAndCloseTransaction() {
		commit();
		closeTransaction();
	}

	public void flush() {
		em.flush();
	}

	public void joinTransaction() {
		em = emf.createEntityManager();
		em.joinTransaction();
	}

	public DAOFactory(Class<T> entityClass) {
		this.entityClass = entityClass;
	}

	public void save(T entity) {
		em.persist(entity);
	}

	public void delete(T entity) {
		T entityToBeRemoved = em.merge(entity);

		em.remove(entityToBeRemoved);
	}

	public T update(T entity) {
		return em.merge(entity);
	}

	public T find(int entityID) {
		return em.find(entityClass, entityID);
	}

	public T findReferenceOnly(int entityID) {
		return em.getReference(entityClass, entityID);
	}

	// Using the unchecked because JPA does not have a
	// em.getCriteriaBuilder().createQuery()<T> method
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<T> findAll() {
		CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
		cq.select(cq.from(entityClass));
		return em.createQuery(cq).getResultList();
	}
	
	// Using the unchecked because JPA does not have a
	// query.getSingleResult()<T> method
	@SuppressWarnings("unchecked")
	protected T findOneResult(String namedQuery, Map<String, Object> parameters) {
		T result = null;

		try {
			Query query = em.createNamedQuery(namedQuery);

			// Method that will populate parameters if they are passed not null and empty
			if (parameters != null && !parameters.isEmpty()) {
				populateQueryParameters(query, parameters);
			}

			result = (T) query.getSingleResult();

		} catch (NoResultException e) {
			System.out.println("Nenhum resultado retornado pela query: " + namedQuery);
		} catch (Exception e) {
			System.out.println("Erro durante a execução da query: " + e.getMessage());
			e.printStackTrace();
		}

		return result;
	}


	@SuppressWarnings("unchecked")
	protected List<T> findManyResult(String namedQuery, Map<String, Object> parameters){
		List<T> result = null;

		try{
			Query query = em.createNamedQuery(namedQuery);

			if (parameters != null && !parameters.isEmpty()) {
				populateQueryParameters(query, parameters);
			}
			result = query.getResultList();

		} catch (NoResultException e) {
			System.out.println("Nenhum resultado retornado pela query: " + namedQuery);
		} catch (Exception e) {
			System.out.println("Erro durante a execução da query: " + e.getMessage() + "\n" + namedQuery);
			e.printStackTrace();
		}

		return result;
	}



	private void populateQueryParameters(Query query, Map<String, Object> parameters) {
		for (Entry<String, Object> entry : parameters.entrySet()) {
			query.setParameter(entry.getKey(), entry.getValue());
		}
	}

}

Agradeço desde já por qualquer ajuda.

6 Respostas

alanrodrigues

Parameter value [3] did not match expected type [br.com.unip.menudroidweb.model.GrupoProduto]

Cara… pelo erro…
parece que o parametro esperado é um objeto do tipo GrupoProduto e não o id dele…

Z

Então, mas o que eu faria nesse caso?
Instancio um objeto GrupoProduto e passo ele?

alanrodrigues

De onde vem esse idGrupoProduto?
posta a view dessa parte ai…

Z

Cara, consegui aqui! Fiz o seguinte:

GrupoProdutoFacade gProd = new GrupoProdutoFacade(); GrupoProduto grupo = gProd.findGrupoProduto(idGrupoProduto);

e passei

alanrodrigues

blza…
então…
vc pode fazer isto passando o id da view pro bean e fazendo uma busca pelo id, depois passando o objeto ou
passando o objeto direto da view pro bean usando um entityConverter, e buscando direto pelo objeto…
d buenas…

ou…
marca o tópico como resolvido pro povo não ficar entrando a toa…

Z

Pronto!

Valeu pela ajuda amigo!

Criado 28 de outubro de 2012
Ultima resposta 29 de out. de 2012
Respostas 6
Participantes 2