Erro de conversao com hibernate

3 respostas
L

pessoal estou precisando de ajuda com esta consulta aqui:

List<Produto> list=null ;
	@SuppressWarnings("unchecked")
	public List<Produto> ListarTodosComFiltro(Integer id) {
		session = HibernateUtil.getInstance();		
		 try{
		 Query query =session.createSQLQuery(
"select distinct *  from produto p ," +
"pedido ped where p.produtoid not in(select iv.produtoid from itensvenda" +
" iv where iv.produtoid = p.produtoid  and iv.pedidoid = :id ) order by p.modelo asc")
.setInteger("id", id);
		
		 Iterator pairs = query.list().iterator();
		// Iterator pairs = q.getResultList().iterator();
		while ( pairs.hasNext() ) {
		Object[] pair = (Object[]) pairs.next();
		Produto p = (Produto) pair[0];			
		list.add(p);
		}		
		 return list;
		 } finally {
	        	session.close();
	        }
		
	}

ela tem que me retornar uma lista de objetos produto,que serao inseridos em um selectOneMenu.
mais ta dando este erro:

14:54:02,828 INFO  [STDOUT] 14:54:02,828 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
java.lang.ClassCastException: java.lang.Integer cannot be cast to com.Lgweb.Tcc.Model.Produto
	at com.Lgweb.Tcc.Dao.DaoProduto.ListarTodosComFiltro(DaoProduto.java:131)
	at com.Lgweb.Tcc.Controller.ControlPedido.getProdutoids(ControlPedido.java:290)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

se alguem puder ajudar fico mto grato abracos.

3 Respostas

B

Amigo, o problema é o segunte. Quando voce está fazendo o select no banco voce está trazendo apenas os “dados primitivos” da tabela de produto. Isso quer dizer que voce não pode converter esses dados diretamente para o objeto. No caso, voce precisaria pegar esses dados e usa-los para preecher os dados do objeto Produto…

Exemplo:

// Iterator pairs = q.getResultList().iterator();  
     while ( pairs.hasNext() ) {  
       Object[] pair = (Object[]) pairs.next();              
       Produto p = new Produto();

       p.setId( (Integer) pair[0] );
       p.setNome( (String) pair[1] );

       list.add(p);  
     }

Espero ter ajudado…

L

Opa blz caraconsegui resolver assim:

List<Produto> lista = new LinkedList<Produto>(); 
	public List<Produto> ListarTodosComFiltro(Integer id) {
		session = HibernateUtil.getInstance();		
		 try{
		 Query query =session.createSQLQuery(
"select distinct *  from produto p ," +
"pedido ped where p.produtoid not in(select iv.produtoid from itensvenda" +
" iv where iv.produtoid = p.produtoid  and iv.pedidoid = :id ) order by p.modelo asc")
.setInteger("id", id);
		
		Iterator pairs = query.list().iterator();	
		System.out.println(pairs.getClass().getName()+"teste");
		while ( pairs.hasNext() ) {
		Object[] pair = (Object[]) pairs.next();
		System.out.println(pair[0]+"valor do pair[0]");
		Integer ID =(Integer) pair[0];
		Produto loadprod=findProduto(ID);
		Produto p = loadprod;	
		System.out.println(p.getModelo());
			
		lista.add(p);
		}		
		 return lista;
		 } finally {
	        	session.close();
	        }
		
	}

eu pego o codigo e faco outro select onde retorno o objeto,mas tem um problema,
agora ele esta retornando 6vezes o mesmo objeto o que a de errado aqui ?
vlw,mto obrigado pela dica :smiley: .

L

consegui resolver usando

Set<Produto> lista = new LinkedHashSet<Produto>();

mas se alguem souber como fazer isto direto no select eu agradeço.
abraços.

Criado 16 de abril de 2008
Ultima resposta 16 de abr. de 2008
Respostas 3
Participantes 2