Hibernate e NamedQuery

Galera, seguinte o amigo meu pego um tutorial do jakefrog aqui do GUJ sobre JSF + Hibernate
estamos fazendo o TCC juntos

agora eu preciso implementar uma busca de produto por grupo de produto
e no material que tenho aqui o código seria assim:

Model

@NamedQueries(value={
		@NamedQuery(name="Produto.buscarPorGrupoProduto", query="from Produto where idGrupoProduto = :grupoProduto")		
})
public class Produto implements Serializable {
// Codigos
}

DAO (que eu sei fazer, que aprendi uns anos atrás em um curso)


public List<Produto> buscarPorGrupoProduto(int  grupoProdutoId) {
		Session sessao = HibernateUtil.getSession(); //HibernateUtil
		try {
			Transaction tx = sessao.beginTransaction();
			Query q = sessao.getNamedQuery("Produto.buscarPorGrupoProduto");
			q.setString("grupoProduto", grupoProdutoId);
			List<Produto> p =  q.list();
			tx.commit();
			return p;
		} catch(Exception ex) {
			ex.printStackTrace();
			return null;
		} finally {
			if (sessao != null) {
				try {
					sessao.close();
				} catch(Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

Agora como eu faco com essa codificação


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.Produto;

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;
	}

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

ProdutoDAO

package br.com.unip.menudroidweb.dao;

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

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

	public ProdutoDAO() {
		super(Produto.class);
	}
	
	

}

ProdutoFacade

package br.com.unip.menudroidweb.facade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

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

import com.google.gson.Gson;

@Path("/produto")
public class ProdutoFacade implements Serializable {
	private static final long serialVersionUID = 7626044516417662074L;
	private ProdutoDAO produtoDAO = new ProdutoDAO();

	
	@PUT
	@Path("/incluir")
	@Produces("application/json")
	public void createProduto(Produto produto) {
		produtoDAO.beginTransaction();
		produtoDAO.save(produto);
		produtoDAO.commitAndCloseTransaction();
	}

	public void updateProduto(Produto produto) {
		produtoDAO.beginTransaction();
		Produto persistedProduto = produtoDAO.find(produto.getIdProduto());
		persistedProduto.setDescricao(produto.getDescricao());
		persistedProduto.setGrupoProduto(produto.getGrupoProduto());
		persistedProduto.setObservacaoCardapio(produto.getObservacaoCardapio());
		persistedProduto.setPrecoCusto(produto.getPrecoCusto());
		persistedProduto.setPrecoVenda(produto.getPrecoVenda());
		produtoDAO.update(persistedProduto);
		produtoDAO.commitAndCloseTransaction();
	}

	public Produto findProduto(int produtoId) {
		produtoDAO.beginTransaction();
		Produto produto = produtoDAO.find(produtoId);
		produtoDAO.closeTransaction();
		return produto;
	}

	public List<Produto> listAll() {
		produtoDAO.beginTransaction();
		List<Produto> produto = produtoDAO.findAll();
		produtoDAO.closeTransaction();
		return produto;
	}

	public void deleteProduto(Produto produto) {
		produtoDAO.beginTransaction();
		Produto persistedProduto = produtoDAO.findReferenceOnly(produto.getIdProduto());
		produtoDAO.delete(persistedProduto);
		produtoDAO.commitAndCloseTransaction();
	}
	
//	Metodos WS Android
	
	@GET
	@Path("/listar")
	@Produces("application/json")
	public String listarTodosAndroid() {
		produtoDAO.beginTransaction();
		ArrayList<Produto> produto = (ArrayList<Produto>) produtoDAO.findAll();
		produtoDAO.closeTransaction();
		return new Gson().toJson(produto);
	}
	
	@GET
	@Path("/listar/{id}")
	@Produces("application/json")
	public String findProdutoAndroid(@PathParam("id") int produtoId) {
		produtoDAO.beginTransaction();
		Produto produto = produtoDAO.find(produtoId);
		produtoDAO.closeTransaction();
		return new Gson().toJson(produto);
	}
}

consegui fazer (eu acho) só está dando um erro
alguém sabe me dizer o porque?

ProdutoDAO

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


	@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());
			e.printStackTrace();
		}

		return result;
	}

Produto


@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";

ProdutoFacade

	@GET
	@Path("/listarporgrupoproduto/{id}")
	@Produces("application/json")
	public String listarPorGrupoProduto(@PathParam("id") int grupoProdutoId){
		produtoDAO.beginTransaction();
		ArrayList<Produto> produto = (ArrayList<Produto>) produtoDAO.findProdutoByGrupoProduto(grupoProdutoId);
		produtoDAO.closeTransaction();
		return new Gson().toJson(produto);
	}

Erro


Erro durante a execução da query: Parameter value [1] did not match expected type [br.com.unip.menudroidweb.model.GrupoProduto]
java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [br.com.unip.menudroidweb.model.GrupoProduto]
	at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:375)
	at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:348)
	at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:375)
	at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:72)
	at br.com.unip.menudroidweb.dao.DAOFactory.populateQueryParameters(DAOFactory.java:143)
	at br.com.unip.menudroidweb.dao.DAOFactory.findManyResult(DAOFactory.java:125)
	at br.com.unip.menudroidweb.dao.ProdutoDAO.findProdutoByGrupoProduto(ProdutoDAO.java:20)
	at br.com.unip.menudroidweb.facade.ProdutoFacade.listarPorGrupoProduto(ProdutoFacade.java:93)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
	at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
	at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
	at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
	at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
	at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
	at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
	at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
	at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1480)
	at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1411)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
	at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
	at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Alguém sabe me dizer que erro é esse?
quando eu tento acessar pelo webservice me da esse erro e retorna null na pagina

Alguém???

parameters.put("grupoProduto", idGrupoProduto);

idGrupoProduto é um inteiro.

Ele esta dizendo que o parametro deveria ser do tipo GrupoProduto. Poste a sua classe Produto, por favor.

[quote=YvGa]parameters.put("grupoProduto", idGrupoProduto);
idGrupoProduto é um inteiro.

Ele esta dizendo que o parametro deveria ser do tipo GrupoProduto. Poste a sua classe Produto, por favor.[/quote]

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;
	}

}

ae minha classe Produto
valeu pela ajuda :slight_smile:

query="select p from Produto p where p.grupoProduto = :grupoProduto"

Repare que no hql voce diz: onde a propriedade grupoProduto do Produto for igual a…

Mas a propriedade grupoProduto é do tipo GrupoProduto. Quando voce passa o parametro voce passa um inteiro, ele esta esperando um GrupoProduto mas recebe um inteiro. Mude o seu hql para que espere um inteiro. Ou passe um GrupoProduto por parametro na query.