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

21 respostas
V

Pessoal to apanhando do Hibernate… rs se alguem já passou por essa situação e puder ajudar…

é o seguinte tenho o seguinte metodo

public List<RelatorioStausTarefaProjetoModel> statusTarefaProjeto(){
		Session session = factory.openSession();
		Query query = session.createQuery("SELECT chaveComposta.projeto.id, status, COUNT(*) AS numTarProj FROM ProjetoTarefa pt GROUP BY status, chaveComposta.projeto.id");
		
		return query.list(); 
	}

mas na hora que vou usar tipo

public static void main(String[] args) {
	
		GenericDaoHibernateImpl<RelatorioStausTarefaProjetoModel, Integer> daoRelStatProj = new GenericDaoHibernateImpl<RelatorioStausTarefaProjetoModel, Integer>(RelatorioStausTarefaProjetoModel.class);
		
		
		List<RelatorioStausTarefaProjetoModel> rel = daoRelStatProj.statusTarefaProjeto();
		System.out.println(rel.get(0).getCont());
	

		
	}

Da esse erro…

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to modelo.RelatorioStausTarefaProjetoModel
	at relatorio.RelatorioStatusTarefasProjeto.main(RelatorioStatusTarefasProjeto.java:37)

21 Respostas

D

Olá

Verifica o que essa linha retorna.

# Session session = factory.openSession();

Query query = session.createQuery(“SELECT chaveComposta.projeto.id, status, COUNT(*) AS numTarProj FROM ProjetoTarefa pt GROUP BY status, chaveComposta.projeto.id”);

return query.list();

Acho que o hibernate retorna uma List<Object[]>… dai vc precisa trabalhar com ele.

Creio que seja isso que esteje acontecendo.

Espero ter ajudado
Flwss

V

É verdade mas o problema ta dando nos campos

ex.: se eu quiser pegar o campo cont ele me da erro. entendeu?

D

Hum…

É uma tentativa, remove o AS numTarProj, talvez esse alias ele não esteje gostando.

Ou esse SQL não seja possível executar.

Se você puder colcar o stacktrace do erro seria melhor.

Flwss

V

Tentei fazer oque vc falou mais ainda assim não rolou

e o stackTrace que aparece é só esse que eu postei acima mesmo.

V

e parece que ele te retornando uma lista de List corretamente mais o conteudo dela ta vindo um tudo object

Observe :

Hibernate: select projetotar0_.idprojeto as col_0_0_, projetotar0_.status as col_1_0_, count((projetotar0_.idprojeto, projetotar0_.idtarefa)) as col_2_0_ from projetotarefa projetotar0_ group by projetotar0_.status , projetotar0_.idprojeto
2010-06-17 20:55:19,094 DEBUG org.hibernate.jdbc.AbstractBatcher about to open ResultSet (open ResultSets: 0, globally: 0) 
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:  
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:  
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:  
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:  
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:  
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:  
2010-06-17 20:55:19,094 DEBUG org.hibernate.loader.Loader result row:

mas só que não tem como eu iterar em cima do atributo

D

Faz assim

...
// Antes do return
//return query.list();

List&lt;Object[]&gt; objs = query.list();
return objs;

...

Dai coloca um break point na linha do list<object[]>, veja quais objetos tem dentro dai para trabalhar com eles.
Acho que seja esse linha… to suspentando dela. srsrs

V

veio isso…

[[Ljava.lang.Object;@1e3e7d2, [Ljava.lang.Object;@188a387, [Ljava.lang.Object;@1a81bd5, [Ljava.lang.Object;@1bb60ad, [Ljava.lang.Object;@c80e21, [Ljava.lang.Object;@17bcd4, [Ljava.lang.Object;@6e3fe4]
D

Veio uma lista destes objetos, certo!?

Dai cada posição do array do object vc vai fazer um cast, por exemplo:

posição 0: id - deve ser um Integer
posição 1: status - deve ser um Integer ou um boolean
posição 2: count - um Long

Com isso vc faz o cast e monta o list do objeto model que você vai retornar.
Se vc usa uma IDE, pode ver a hierarquia com os tipos retornados destes objetos.

objs… List(3)
|---- object (3)
| ------------- id… Integer
|--------------status… Integer
|-------------count… Long

Não sei se deu para entender.

V

ta falando disso…

for (Object o : daoRelStatProj.statusTarefaProjeto()) {
			RelatorioStausTarefaProjetoModel r = (RelatorioStausTarefaProjetoModel) o;
		}
V

tipo ele retorna uma lista de Object certo, até ai eu conseguiria fazer o cast mas eu acredito que ta dando erro porque

na minha classe tem os campos (int, int, String ) quando tento fazer o cast os campos da lista são (Object, Object, Object)

O foda é que não consigo pegar os campos da lista para fazer o cast … deu pra enteder?

B

Acho que você precisa de algo desse tipo:

for(Object[] arrayObjeto : objs) {
     Long id = (Long)  arrayObjeto[0];
     String texto = (String)  arrayObjeto[1];
     //Por aí vai...
}
V

breno500as eu to tentando fazer isso só que meu metodo retorna uma lista de Object ai não consigo pegar esse array de Object

D

Não…

É da parte do hibernate mesmo.
Desta daqui…

List&lt;Object[]&gt; objs = query.list(); 

// Aqui vai ser manipulado o objs.
//Cria suaLiistaModel
for(int i=0;objs....i++){
   
     Object[] aux = obj.get(i);
     
     //Objeto que sualistaModel recebe, vamos chamar de x

      x.setId((Integer)aux[0]) // id
      x.setStatus.......

      suaListaModel.add(x);
}

return suaListaModel;

Mais ou menos isso que tinha falado.
Acho que isso deve resolver seu problema

Editado:
x.setId((String)aux[0]) // id

V

cara é isso mesmo ta dando alguns bugs aqui mas veio alguns campos que eu preciso …

agora preciso sair pois tão me expulsando da empresa

obrigado mesmo,

D

Ok…

Então pode durmir mais tranquilo, pq vc já sabe por onde começar amanhã… srsrsrs

Flwss
Boa noite

V

Fala ai cara cheguei no trabalho a primeira coisa que fiz foi terminar esse relatorio… agradeço MUITO a sua ajuda… Obrigado mesmo…

Para ajudar aos demais membros que possam vir a ter o mesmo problema vou postar o metodo …

public List<RelatorioStausTarefaProjetoModel> statusTarefaProjeto(){
		Session session = factory.openSession();
		Query query = session.createQuery("SELECT chaveComposta.projeto.id, status, COUNT(*) FROM ProjetoTarefa pt GROUP BY status, chaveComposta.projeto.id");
		List<Object[]> objs = query.list(); 

		// Aqui vai ser manipulado o objs.
		//Cria suaLiistaModel
		List<RelatorioStausTarefaProjetoModel> relList = new ArrayList<RelatorioStausTarefaProjetoModel>();

		for (Object[] o : objs) {
	   
		     Object[] aux = o;
		     RelatorioStausTarefaProjetoModel r = new RelatorioStausTarefaProjetoModel();
		     //Objeto que sualistaModel recebe, vamos chamar de x

		      r.setIdprojeto((Integer)aux[0]); // id
		      r.setStatus((StatusTarefa)aux[1]);
		      r.setCont((Long)aux[2]);
		      relList.add(r);
		}

		return relList; 
	}

Valeu

W

galera, estou tendo o mesmo problema em algumas tabelas minhas . reparei q esse problema soh ocorre qdo meu objeto possui Collection, esta certo agir do jeito citado ???
a meu ver o hibernate serve justamente pra evitarmos de ficar trabalhando relacionalmente e trabalharmos com o Objeto em si e fazer isso iria contra o propósito do framework , ou estou enganado ?

vlw galera.

V

cara posta sua HQL ai para entender melhor isso.

W

minha classe com prob:

@Entity
@NamedQueries({
    @NamedQuery(name="Grupo.getGrupos",query="from Grupo"),
    @NamedQuery(name="Grupo.getGrupo",query="from Grupo g where g.cod = :cod"),
    @NamedQuery(name="Grupo.getGruposPorClassif",query="from Grupo g left join g.classif classif where classif.id = :classif")
})
public class Grupo implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="idGrade", referencedColumnName = "id")
    private Grade grade;
    private String cod;
    private String des;
    private boolean ativo;

    @OneToMany(mappedBy = "grupo",cascade=CascadeType.ALL)
    private List<Produto> produto;

    @OneToMany(mappedBy = "grupo",cascade=CascadeType.ALL)
    private List<Imagem> imagem;

    @OneToMany(mappedBy = "grupo",cascade=CascadeType.ALL)
    private List<Opniao> opniao;

    @ManyToMany
    private List<Classif> classif;

    @OneToMany(mappedBy = "grupo",cascade=CascadeType.ALL)
    private List<Preco> preco;
    
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="idLog", referencedColumnName = "id")
    private Logs log;

meu dao:

public List getGruposPorClassif(Classif classif, int qtdGruposExibidos, int pag, Logs logs) {
        //if(Restricao.Restricao(l, "dao0086")) return null;
        tools.Debug.mensagem(Debug.DEBUG_DAO,"dao.loja.GrupoDAO: getGruposPorClassif...");
        secao = HibernateUtil.getSessionFactory().openSession();
        Query q = secao.getNamedQuery("Grupo.getGruposPorClassif");
        q.setParameter("classif", classif.getId());
        q.setFirstResult( ( (pag-1)*qtdGruposExibidos )+ pag);
        q.setMaxResults(qtdGruposExibidos);
        List <Grupo> lista = q.list();
        secao.flush();
        secao.close();
        return lista;
    }
L

Passei pelo mesmo problema por causa do meu SELECT, que usa funções de agrupamento, mas resolvi da seguinte maneira:

No DAO:

public List<Estatistica> getEstatistica() {
		EntityManager em = getEntityManager();
    Query q = null;
    List<Estatistica> retorno = null;
    try {
      StringBuilder sql = new StringBuilder();
      sql.append("select count(*), i.id_impressora, i.numero_serial ");
      sql.append("from tb_impressora i, tb_trocatoner t where i.id_impressora = t.id_impressora ");
      sql.append("group by i.id_impressora, i.numero_serial order by t.data_troca");
      q = em.createNativeQuery(sql.toString());
      retorno = q.getResultList();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    return retorno;    
  }

No controller ficou assim:

listEstatistica = dao.getEstatistica();
      Object[] item = listEstatistica.toArray();
      
      for (Object obj : item) {
        Object[] x = (Object[]) obj;
        String serial = (String) x[2];
        long total = (Long)x[0];
        model.set(serial.toString(), total );
      }

att,

A

thiago.filadelfo:
Não…

É da parte do hibernate mesmo.
Desta daqui…

List&lt;Object[]&gt; objs = query.list(); 

// Aqui vai ser manipulado o objs.
//Cria suaLiistaModel
for(int i=0;objs....i++){
   
     Object[] aux = obj.get(i);
     
     //Objeto que sualistaModel recebe, vamos chamar de x

      x.setId((Integer)aux[0]) // id
      x.setStatus.......

      suaListaModel.add(x);
}

return suaListaModel;

Mais ou menos isso que tinha falado.
Acho que isso deve resolver seu problema

Editado:
x.setId((String)aux[0]) // id

thiago.filadelfo valeuu cara!
Eu estava apanhando a horas pra conseguir pegar os valores em um caso parecido com o do Vitor e consegui de primeira com o seu exemplo…

VALEUUU! :smiley:

Grande abraço.

André Gomes.

Criado 17 de junho de 2010
Ultima resposta 22 de mai. de 2014
Respostas 21
Participantes 6