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!!!