Percorrer list de objetos, recuperando seus parametros

Gostaria de saber como solucionar meu problema.

Tenho uma list carregada com objetos por exemplo do tipo Pessoa, no entanto ao percorrer esta lista e tentar recuperar seus parametros, no caso nome e idade ocorre este erro :

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to projetohibernate.Pessoa

Logo abaixo segue o codigo:

public static void main(String[] args) {

    List resultado = new ArrayList();
    String select = "select * from pessoa";
    Pessoa busca = new Pessoa();
    resultado = busca.listaPessoa(select);   // Aqui a list resultado é carregada com os objetos que vem do banco, a dificuldade é exatamente em recuperar o nome e a idade de
                                                              cada um deles

    [b]for(Iterator iterator = resultado.iterator(); iterator.hasNext();){
        Pessoa teste = (Pessoa) iterator.next();
        System.out.print(teste.getNome());
    }[/b]
}

Alguem poderia me ajudar, me explicar seila, porque pelo que pesquisei em varios lugares, este método era para dar certo hehe.

Grato a atenção.

Ao que parece está ocorrendo um erro de Casting entre Object e o seu tipo Pessoa. Já que você sabe que vai usar um objeto do tipo Pessoa, então poderia experimentar declarar o ArrayList parametrizado já com o tipo Pessoa. Assim você dispensaria um Casting, e eliminaria o problema.

Ao invés de List resultado = new ArrayList(), você usaria:

ArrayList<Pessoa> resultado = new ArrayList<Pessoa>();
Assim o seu ArrayList seria explicitamente de objetos do tipo pessoa.

E aí poderia listar assim:

For(Pessoa teste : resultado){ System.out.print(teste.getNome()); }

o que retorna esse método?


resultado = busca.listaPessoa(select); 

Josenir eu já havia tentado fazer do seu jeito, mas para tirar qualquer dúvida eu refiz, e o erro persiste.

Tinoberto, esse método retorna todas as pessoas encontradas no banco, na Tabela Pessoa, ou seja, todos os objetos, exatamento o que segue abaixo :

RESULTADO: [[Ljava.lang.Object;@755c62bc, [Ljava.lang.Object;@45660d6] …>> os dois objetos do tipo Pessoa no banco.

vou colocar o metodo .listaPessoa();

public List listaPessoa(String select){

    Session sessao = HibernateUtil.getSessionFactory().openSession();
    List<Pessoa> lista = new ArrayList<Pessoa>();
    try {
        sessao.beginTransaction();
        lista = sessao.createSQLQuery(select).list();
        sessao.getTransaction().commit();
    } catch (RuntimeException e) {
        if(sessao.getTransaction()!= null){
            sessao.getTransaction().rollback();
            throw e;
        }
   }
    return lista;
}

o método main segue abaixo :

public static void main(String[] args) {

    List<Pessoa> resultado = new ArrayList<Pessoa>();
    String select = "select * from pessoa";
    Pessoa busca = new Pessoa();
    resultado = busca.listaPessoa(select);

    System.out.println("RESULTADO: "+resultado);

    for(Iterator iterator = resultado.iterator(); iterator.hasNext();){
        Pessoa teste = (Pessoa) iterator.next();
        System.out.print(teste.getNome());
    }
}

ERRO : Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to projetohibernate.Pessoa

Cara se voces puderem me ajudar, fico muito grato.
Obrigado, caso precisem de mais especificações só fala que eu coloco aqui.

Olá amigo.

Desde já eu aviso: nunca mexi com banco de dados, então posso estar falando beiteiras.
Mas pela exceção lançada vindo de um Objeto de Ljava.lang.Object, isso não seria um Cast de um Objeto pessoa direto para um String?
Talvez também se colar o StackTrace inteiro, fique mais fácil de entender o problema e identificar exatamente onde ele está ocorrendo.
Qual linha está lançando a exceção?
A linha que mostra o resultado da busca?

System.out.println("RESULTADO: "+resultado); 

ou a linha que deveria imprimir no console o nome da pessoa no laço do Iterator?

System.out.print(teste.getNome());

ou seria outra?

Talvez lendo o help do Hibernate sobre esta função que você usou possa trazer alguma luz

Bodai toda ajuda é bem vinda, acho que tem algo a ver com passagem de um cas Objeto direto para uma String, pelo que pesquisei, porém já tentei de tudo e não da.

o erro acontece aqui >> Pessoa teste = (Pessoa) iterator.next();

colocarei o main inteiro aqui para facilitar:

public static void main(String[] args) {

    List<Pessoa> resultado = new ArrayList<Pessoa>();
    String select = "select * from pessoa";
    Pessoa busca = new Pessoa();
    resultado = busca.listaPessoa(select);

    System.out.println(resultado);   [b]>> aqui imprimi a lista com os objetos dentro << [[Ljava.lang.Object;@755c62bc, [Ljava.lang.Object;@45660d6][/b]


    for(Iterator iterator = resultado.iterator(); iterator.hasNext();){
        [b]Pessoa teste = (Pessoa) iterator.next();  >>>>> erro <<<<<<<[/b]
        System.out.print(teste.getNome());
    }
}

MENSAGEM DE ERRO : Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to projetohibernate.Pessoa
at projetohibernate.Main.main(Main.java:33)
Java Result: 1

Abaixo segue o metodo listaPessoa()

public List listaPessoa(String select){
Session sessao = HibernateUtil.getSessionFactory().openSession();
List lista = null;

    try {
        sessao.beginTransaction();
        lista = sessao.createSQLQuery(select).list();
        sessao.getTransaction().commit();
    } catch (RuntimeException e) {
        if(sessao.getTransaction()!= null){
            sessao.getTransaction().rollback();
            throw e;
        }
   }
    return lista;
}

Estou pesquisando e tentando de tudo, mas até agora nada…valeu a atenção ae…qualquer nova idéia nem que seja errado manda ae que nao custa tentar.

acho que eu sei o que esta acontecendo, vc tem duas classes que chamam pessoa:

a classe que vc usa para listar

Pessoa busca = new Pessoa(); 

e a classe que representa uma pessoa

List<Pessoa> resultado = new ArrayList<Pessoa>(); 

Com isso quando vc faz a interação vc estaria usando o Pessoa da busca

Faz o seguinte chama a classe que busca as pessoas de PessoaDao e deixa Pessoa para a classe que vc representa os atributos da pessoa.

flw

Tinoberto, boiei AUHIUAH… Cara eu devo ta falando merda, mas é o seguinte, eu tenho somente uma classe Pessoa, e um dos métodos desta classe é o listaPessoa()
Se eu renomear ela para PessoaDAO, não vai mudar nada…

Classe Pessoa :

public class Pessoa implements java.io.Serializable {

 Integer idPessoa;
 private String nome;
 private Integer idade;

 métodos get e set da classe
 e o listaPessoa(), que coloquei no post em cima..

se vc puder seila especificar mais, algum exemplo, as vezes eu to viajando aqui iuAuh
Vlw…

Acredito que seu problema seja o seguinte:

No seu método listaPessoa, você preenche o resultado com uma suposta lista de objetos do tipo pessoa

List&lt;Pessoa&gt; lista = new ArrayList&lt;Pessoa&gt;(); 
lista = sessao.createSQLQuery(select).list(); 

Mas na verdade, o método list() não vai te retornar uma lista de Pessoas, mas sim uma lista de arrays de Object.

Isto acontecte pois o hibernate não tem como saber (automaticamente) que sua query, que pode ser qualquer coisa, retornará apenas pessoas.

Como em tempo de compilação a informação de tipo do generics é desprezada, sua List<Pessoa> é apenas List, e aceita o array de objetos.

Quando você tenta dar cast para o tipo Pessoa:

  Pessoa teste = (Pessoa) iterator.next(); 

Acontece o erro citado, pois cada item da lista é um array de objetos e não uma Pessoa.

Ahn…agora comecou a ficar mais claro…

e sera que voce tem alguma solucao para este caso ?!
Alguma lógica que atenda a esta necessidade…se alguém souber…posta ae! Acredito que vai ajudar muitas pessoas, porque eu pesquisei um monte e não achei nada decente.

lista = sessao.createSQLQuery(select).list(); << tem algum jeito de eu falar pro Java que aqui serão somente pessoas, ele só aceita o .list()

Eu sou meio novatão no hibernate, se eu to sendo muito burro nem liga IUAHIAUh

Vlw…

Solução não tenho pois não conheço hibernate diretamente (uso a sintaxe do JPA).

Mas já que você é novo em hibernate, sugiro que leia algum livro sobre o assunto. Ou a própria documentação no site.
Com certeza este é um caso trivial e na documentação deve ter exemplos de como fazer isto.

Matheus, ao postar códigos, siga essas dicas:
http://www.guj.com.br/posts/list/50115.java

Opa nem tinha me tocado, pode deixar ViniGodoy…cara aproveitando a deixa será que voce tem algum exemplo ou alguma solução ae de bate pronto para meu caso, é só subir e ver o código.
É simples acredito eu, quero varrer uma list carregada com objetos, dando um get em seus atributos.

Essa lista é carregada com uma SQLquery … select * from pessoa, pensava eu que estavam dentro da list array de objetos do tipo pessoa.

Seja la o que for, se voce ou alguém tiver um exemplo de como CARREGAR a list com somente pessoas usando o hibernate, e depois descarregar a lista imprimindo os atributos destes objetos.
Agradeço a atenção.

na apostila da caelum fj-21 no capitulo 16 tem esse exemplo completo. de uma olhada lá. .flw

Tinoberto, li seu material, que por sinal muito bom, prático e fácil de entender, e finaaaaaaalmente consegui.

Po agradeço a atenção de todos por tentar solucionar meu problema, pensei que esse fórum não fosse aquelas coisas, mas tenho de elogiar e reconhecer que é realmente bom.
Certamente quando souber a solução de problemas do pessoal aqui vou cooperar.
E com certeza vão aparecer mais dúvidas. Muito bom o material Tinoberto, vou ler de cabo a rabo todas aquelas apostilas.
Flw…

Sem querer fazer propaganda mas essas apostilas são muito boas, sempre recomendo. Agora coloque resolvido no topico para facilitar a organização do forum, flw.