Hibernate+Anotation+DAO+HQL

Olá galera!

Estou precisando da sua ajuda para solucionar o seguinte problema:
Estou desenvolvendo uma aplicação com eclipse+hibernate+anotations+DAO a minha dúvida é que tipo de variável irá receber o resultado (retorno) do método abaixo, isso levando em consideração que tenho que tenho uma consulta utilizando o INNER JOIN e tenho que popular uma JTable com essa consulta HQL abaixo:

public class ColaboradorDAO {
	private Session session;
	
	public ColaboradorDAO() throws Exception {

	}

  public List procurarPorNome(String Col_nome) {
		
session = ConnectDB.getInstance();
Transaction tx = session.beginTransaction();	

Query select = session.createQuery("FROM Setor setor inner join setor.colaborador colab Where Col_nome like :entrada");
		
select.setString("entrada", Col_nome);		
List list = select.list();		
tx.commit();
session.close();
		
return list;		
  }
}

Observe que estou utilizando o INNER JOIN, com isso estou juntando os dados de dois objetos distintos, além disso, o método retorna um List. Até ai tudo está ok, o grande problema é para onde retornar o resultado desse método. Eu estou retornando o resultado para o codigo abaixo, mas ocorre um erro de conversão no momento que o resultado é percorrido. Veja:

try{
	ColaboradorDAO colaborador = new ColaboradorDAO();				
	procura_nome = Tnome.getText();	
		
iteratorResultado = colaborador.procurarPorNome(procura_nome+"%").iterator();

     javax.swing.table.DefaultTableModel linha = (	javax.swing.table.DefaultTableModel)Tabela.getModel();
				
		//percorre os dados da instancia iterator
	while(iteratorResultado.hasNext()){		 
	[size=18][b]O ERRO DE CONVERSÃO OCORRE NESTA LINHA ABAIXO [/b][/size]
    Setor setor = (Setor) iteratorResultado.next();		
			
     linha.addRow(new String[] {String.valueOf(setor.getCol_codigo()),         setor.getCol_nome(), "", ""});				
		
		}		         
		
		} catch (Exception h){
		//captura os erros proveniente deste tratamento
		h.printStackTrace();
		}

Vc pode notar que a variável iteratorResultado do tipo Iterator receber o resultado da consulta, até ai está tudo funcionando (tranquilo).

iteratorResultado = colaborador.procurarPorNome(procura_nome+"%").iterator();

O problema está no momento de percorrer o iteratorResultado para polular a tabela, em que eu não estou sabendo converter o resultado para o tipo de dado correto!

while(iteratorResultado.hasNext()){
    Setor setor = (Setor) iteratorResultado.next();//o erro ocorre aqui nesta linha

O problema está somente na conversão e nada mais. Pelo fato do iteratorResultado.next() obter dados tanto do Colaborador quanto Setor está causando problemas para conversão para o tipo Setor!

Eu sei que o tipo Setor não suporta o valor passado pelo iteratorResultado mas coloque ele neste post no código só para dar um exemplo, Abaixo está o erro gerado pelo eclipse quando rodo a aplicação

O ERRO GERADO É ESTE:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
java.lang.ClassCastException: [Ljava.lang.Object;
	at src.portaria.gui.Tela_consultaColaborador.bbuscar(Tela_consultaColaborador.java:298)
	at src.portaria.gui.Tela_consultaColaborador.getTBresultado(Tela_consultaColaborador.java:194)
	at src.portaria.gui.Tela_consultaColaborador.getSCresultado(Tela_consultaColaborador.java:158)
	at src.portaria.gui.Tela_consultaColaborador.getPresultado(Tela_consultaColaborador.java:144)
	at src.portaria.gui.Tela_consultaColaborador.getPconsultaColaborador(Tela_consultaColaborador.java:99)
	at src.portaria.gui.Tela_consultaColaborador.initialize(Tela_consultaColaborador.java:66)
	at src.portaria.gui.Tela_consultaColaborador.<init>(Tela_consultaColaborador.java:60)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at org.eclipse.ve.internal.java.vce.launcher.remotevm.JFCLauncher$1.run(JFCLauncher.java:59)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

O mapeamento, claúsula HQL está ok, o problema é só na conversão indicada acima! As classes de persistência que utilizo são mostradas a seguir:

Neste poste não coloquei o anotation nas classes persistentes mais tenho certeza que o mapeamento está correto.

public class Colaborador implements Serializable{

	public Colaborador(){
		
	}
	
	 private Long Col_codigo;
	 private String Col_nome;
	 private String Col_funcao;
	 private String Col_fone;
	 private Long Col_Set_codigo;
	 private Setor setor;
}


public class Setor implements Serializable{	
	
public Setor(){

}
 
	private Long Set_codigo;
	private String Set_nome;
	private String Set_descricao;
	private String Set_localizacao;		
	public Set<Colaborador> colaborador;
}

O que devo fazer Criar um tipo de dado especifico para atender a consulta? Devo utilizar um outro tipo de collection pra atender a conversão?
Já procurei no livro em vários livro, no google e no guj e não obtive sucesso!!!

Gostaria de sua ajuda! Se este post for resolvido tenho certeza que vários usuários do guj ficarão bastante satisfeitos, além disso este post poderá contribuir e muito para comunidade que está iniciando com hibernate!

PRECISO DE SUA AJUDA!!!

Conto com sua ajuda para solucionar o problema!!!

Obrigado

Esse é o erro que está sendo motrado:

java.lang.ClassCastException: [Ljava.lang.Object;  

Faça um debug e verificaque como estão os objeto de retorno na lista com a opção inspect.

[quote]Faça um debug e verificaque como estão os objeto de retorno na lista com a opção inspect.
[/quote]

Os objetos estão retornando perfeitamente! O problema é encontrar o tipo de dados certo para receber o resultado do iteratorResultado.next()

        //percorre os dados da instancia iterator   
    while(iteratorResultado.hasNext()){         
   O ERRO DE CONVERSÃO OCORRE NESTA LINHA ABAIXO
    Setor setor = (Setor) iteratorResultado.next(); //o erro está nesta linha no tipo setor por isso é mostrado 
    // o seguinte erro: java.lang.ClassCastException: [Ljava.lang.Object;      
               
     linha.addRow(new String[] {String.valueOf(setor.getCol_codigo()),         setor.getCol_nome(), "", ""});                 
           
        } 

entendeu colega !!! é o tipo de dados que não é do tipo correto

[quote=hvivox][quote]Faça um debug e verificaque como estão os objeto de retorno na lista com a opção inspect.
[/quote]

Os objetos estão retornando perfeitamente! O problema é encontrar o tipo de dados certo para receber o resultado do iteratorResultado.next()

        //percorre os dados da instancia iterator   
    while(iteratorResultado.hasNext()){         
   O ERRO DE CONVERSÃO OCORRE NESTA LINHA ABAIXO
    Setor setor = (Setor) iteratorResultado.next(); //o erro está nesta linha no tipo setor por isso é mostrado 
    // o seguinte erro: java.lang.ClassCastException: [Ljava.lang.Object;      
               
     linha.addRow(new String[] {String.valueOf(setor.getCol_codigo()),         setor.getCol_nome(), "", ""});                 
           
        } 

entendeu colega !!! é o tipo de dados que não é do tipo correto[/quote]
colega, se vc fazer o que falei você conseguirar ver como o hibernate monto seus objetos !
ele pode esta perfeitamento retornando um Array de Object onde ira esta o Objeto “Setor” e o "Colaborador " relacionado
sendo assim ao tentar realizar o cast vc receberá uma exceção. Então olhe como estão montados seus objetosssss !

Sou leigo quando o assunto é Object[], vc pode me explicar o que é montagem de objeto?
Depois que eu verificar como os objetos estão montado, o que deverei fazer em seguida?

obrigado pela atenção parceiro!!!

O hibernate é quem ira popular seu Objeto (POJO) com os resultados tragos do banco, e montar a sua lista de retorno, vc esta esperando que ele retorne uma List de Setor, mas ele esta retornando um outro tipo de objeto (verifica o tipo do objeto retornado, pode ser que seja um array object) caso queira somente o objeto setor na lista tente como a no HQL o objeto que deseja que ele retorne :

select setor FROM Setor setor inner join setor.colaborador colab Where Col_nome like :entrada"

com isso ele ira retorna somente um tipo de objeto na lista.
testa ai ai e ver se resolve teu problema !

Estou querendo obter dados do setor e do colaborador também, entende! Se fosse dados somente do setor já teria resolvido o problema!

Alguém tem alguma outra sugestão para este problema?

rs rs
cara pode ao menos me falar qual o tipo do objeto de retorno ?!
melhor faça no seu codigo :

while(iteratorResultado.hasNext()){           
O ERRO DE CONVERSÃO OCORRE NESTA LINHA ABAIXO   
//Setor setor = (Setor) iteratorResultado.next(); //o erro está nesta linha no tipo setor por isso é mostrado   
// o seguinte erro: java.lang.ClassCastException: [Ljava.lang.Object;         
     System.out.println(iteratorResultado.next().getClass().getName());              

e me mande o resultado rs

caso o resutlado seja “Ljava.lang.Object” e muito provavel que seja um array de objet então tera que pecorrer esse array e ir buscando os resultados
(como os objetos se relaciona verifique o porque dele não esta trazendo a lista dos colaboradores dentro do objeto Setor que seria o correto, de uma olha se não me engano no fetch, ou lazy algo assim )

È paceiro! o resultado foi esse: Ljava.lang.Object e agora como faço para percorrer?

Obrigado pela ajuda!!!

Oi pessoal como faço para percorrer um Object???

Object[i];

ou seja…

Object[1]
Object[2]
Object[3]
Object[3]

Um Object[] é um array de objetos… sacou ?

abs

tive um problema “parecido” com o seu…

postei minha solução no meu blog, aqui: http://douglascrp.blogspot.com/2008/03/join-entre-classes-com-group-by.html

vê se te ajuda.

falou

faca casting para Object[], como ja sugeriram!!!

e depois percorra essa array, que tera em cada posicao um atributo “primitivo”.

Muito obrigado pela ajuda!!!

a solução é essa:

Um grande abraço a todo vcs!!!

Como faço para colocar [RESOLVIDO] no tópico do assunto?

Fala moçada! espero ter ajudado e contibuido com esse post, se alguém quiser tirar duvidas estarei a disposição! oK>>>>>>>>>>>>>>>