Java.lang.ClassCastException quando executo busca no BD para popular JTable

Ola pessoal, quando executo uma busca no banco de dados, eu recebo esse erro:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to teste.ems2.model.Atividade at teste.ems2.application.Adm.Tables.ProjetoTableModelStandard.getValueAt(ProjetoTableModelStandard.java:135) at javax.swing.JTable.getValueAt(JTable.java:2716) ...

O codigo que uso para inserir valores em uma JTable com modeloAbstractTableModel é:

[code] @Override
public Object getValueAt(int indexRow, int indexColumn) {

    Activite ac = rows.get(indexRow);  //linha 135

    switch (indexColumn) {
        case 0:
            return ac.getNomActivite();
        case 1:
            return ac.getPhases().get(0).getDateDebut();
        case 2:
            return ac.getPhases().get(0).getDateFin();
        case 3:
            return ac.getPhases().get(0).getPourcentage();
        case 4:
            return ac.getPhases().get(1).getDateDebut();
        case 5:
            return ac.getPhases().get(1).getDateFin();
        case 6:
            return ac.getPhases().get(1).getPourcentage();
        case 7:
            return ac.getPhases().get(2).getDateDebut();
        case 8:
            return ac.getPhases().get(2).getDateFin();
        case 9:
            return ac.getPhases().get(2).getPourcentage();
        case 10:
            return ac.getPhases().get(3).getDateDebut();
        case 11:
            return ac.getPhases().get(3).getDateFin();
        case 12:
            return ac.getPhases().get(3).getPourcentage();
        case 13:
            return ac.getPhases().get(4).getDateDebut();
        case 14:
            return ac.getPhases().get(4).getDateFin();
        case 15:
            return ac.getPhases().get(4).getPourcentage();
        case 16:
            return ac.getPersonnes().get(0).getPreNom() + "  " + ac.getPersonnes().get(0).getNom();
        case 17:
            return ac.getPersonnes().get(1).getPreNom() + "  " + ac.getPersonnes().get(1).getNom();
        case 18:
            return ac.getPersonnes().get(2).getPreNom() + "  " + ac.getPersonnes().get(2).getNom();
        case 19:
            return ac.getPersonnes().get(3).getPreNom() + "  " + ac.getPersonnes().get(3).getNom();
        case 20:
            return ac.getPersonnes().get(4).getPreNom() + "  " + ac.getPersonnes().get(4).getNom();
        case 21:
            return ac.getNbHeureV();
        case 22:
            return ac.getNbHeureC();
        case 23:
            return ac.getNbHeureA();
        default:
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
    }
}[/code]

O codigo que uso para buscar na base de dados:

[code]public List findAllActiviteELEC(String tache) {

    try {
         return (List<Activite>) em.createQuery("SELECT ac, ta FROM Activite ac, Tache ta WHERE ac.group.nomGroupe = 'ELEC' and ta.nomTache = '"+tache+"'").getResultList();     
    } catch (NoResultException n) {
        return null;
    } finally {
        em.close();
    }
}[/code]

Alguém sabe o motivo disso ? Ja procurei aqui no forum achei algumas coisas relacionadas, porém não consigo arrumar mesmo se eu fizer um Vetor de Objects[] e pegar cada indice, ele sempre da a mensagem que não pode ser convertido para o tipo do objeto Activite.

Muito obrigado !

O erro esta no seu metodo getValueAt, pois ele pede retorno de um Object, e os seus return provavelmente estao vindo de outro tipo.

Experimento botar em cada return um cast para Object:

case 11:  
            return (Object)ac.getPhases().get(3).getDateFin();  

Eu nao faria assim como voce esta fazendo, pois eu estando com o objeto preenchido, basta chama-lo onde eu precisar: ac.getPhases().get(0).getDateDebut();

[quote=rof20004]O erro esta no seu metodo getValueAt, pois ele pede retorno de um Object, e os seus return provavelmente estao vindo de outro tipo.

Experimento botar em cada return um cast para Object:

case 11:  
            return (Object)ac.getPhases().get(3).getDateFin();  

Eu nao faria assim como voce esta fazendo, pois eu estando com o objeto preenchido, basta chama-lo onde eu precisar: ac.getPhases().get(0).getDateDebut();

[/quote]

Sim, eu fiz como voce pensa, e é o que enviei, não sei como modificar o meu getValueAt para retornar o tipo de cada linha.
Em um teste que eu fiz durante a criacao da minha JTable, isso funcionou perfeitamente, o problema é o resultado do valor do findAll … que retorna List, ele não esta aceitando cast.

Eu sabia que o que voce disse não iria funcionar, porém eu tentei pra mandar pra voce o erro, que é o mesmo.

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to teste.ems2.model.Atividade at teste.ems2.application.Administrateur.table.ProjetoTableModelStandard.getValueAt(ProjeotTableModelStandard.java:135) at javax.swing.JTable.getValueAt(JTable.java:2716) ...

Abraco

Andriel,

Não sei se vc está usando, mas é muito simples implementar um modelo de tabela(AbstractTableModel) e uma das vantagens desse tipo de implementação é que vc pode ter como retorno um tipo especifico de classe.

Dá uma lida aqui: http://www.javasimples.com.br/swing-awt/death-to-defaulttablemodel-abstracttablemodel-rulez

Vale a pena.

Sim, estou, olha o meu comentário do primeiro post.

Perfeito!!

Cara, se possível gasta um tempo vendo o tutorial que passei, a idéia dessa implementação está bem refactorada.
Agora em relação ao seu erro, seria legal você “debugar” o registro que está causando o erro, só assim mesmo para saber em qual case “tal coluna” está entrando.

Nesse caso, ele não está entrando no case, ele para na atribuição da linha 135.

sendo que:

Agradeço pelo comentário. Mas creio que o pau está mesmo no método de busca, só não estou sabendo como arrumar.

Obrigado.

andrielc,

Você consegue para a execução nessa linha, e antes da “atribuição” dar apenas

rows.get(indexRow); //Um watch ou inspect do eclipse

Para ver o que retorna?

O estranho disso é que seu List é de um tipo seguro, e aparentemente não é isso que está acontecendo.

[quote=robinsonbsilva]andrielc,

Você consegue para a execução nessa linha, e antes da “atribuição” dar apenas

rows.get(indexRow); //Um watch ou inspect do eclipse

Para ver o que retorna?

O estranho disso é que seu List é de um tipo seguro, e aparentemente não é isso que está acontecendo.[/quote]

Coloquei um wath no meu resultado e veio um Colection<Atividade,Tarefa>, então o Cast nunca funcionaria, logo, alterei a busca do find com uma UNION entre as duas tabelas, Grupo e Tarefa e retornou as atividades certinho.

Valeu pela dica! =)