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

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)

Olá

Verifica o que essa linha retorna.

[quote]# 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(); [/quote]

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

É verdade mas o problema ta dando nos campos

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

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

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

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

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

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

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]

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.

ta falando disso…

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

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?

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...
}

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

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

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,

Ok…

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

Flwss
Boa noite

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

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.

cara posta sua HQL ai para entender melhor isso.

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;
    }