[RESOLVIDO - FINALMENTE]Duvida Hibernate

25 respostas
J

Estou tendo um problema q está me dando dor de cabeça

Tenho um objeto (Armário) que tem uma lista de outros objetos (Sapatos) , quando eu faço:

createQuery( "from Armario where Armario.sapato.idSapato = 284 " )

Dá o seguinte erro:

org.hibernate.QueryException: illegal attempt to dereference collection

25 Respostas

Andre_Fonseca

oi,

por acaso sapato é uma coleção dentro de Armario?

caso seja tente fazer assim

createQuery( "from Armario o, IN (o.sapatos) as s where s.idSapato = 284" )
J

Exato, acho que não fui bem claro.

Andre_Fonseca

oi,

dá uma testada nesse codigo que coloquei ai acima e veja se funciona…

J

Aquele erro sumiu agora deu esse aqui

org.hibernate.hql.ast.QuerySyntaxException: expecting OPEN,
J

Hum acho que esqueci dos parenteses… :oops:

J

Po blz ele executou, só que não está trazendo os atributos do objeto Armário…

J

Po e a query que o Hibernate executou eu peguei no console e rodei direto no banco, trouxe os registros certinhos, porém na aplicação nada…

Andre_Fonseca

hmm, como você está retornando os valores? posta o código

abs

J

Acho q sei o erro porem naum sei a solução, ele está retornando os valores de armário e sapato, porém estava jogando tudo dentro de uma lista de armário. Como resolvo isso??

Andre_Fonseca

oi,

a lista de armario está preenchida? você precisa do que? dos sapatos?

posta o código de como você está executando a consulta e retornando os resultados…

J

Esse aí é o método que utilizo para retornar…

protected <T extends Serializable> List<T> getPureList(Class<T> classToCast, String query, Object... values) {

            Session ses = getSession();
            ses.beginTransaction();
            Query qr = ses.createQuery(query);
            /* for (int i = 1; i <= params.length; i++) {
            qr.setParameter(i, params[i -1]);
            }*/
            int count = 0;
            for (Object value : values) {
                qr.setParameter(count++, value);
            }
            List<T> toReturn = qr.list();
            ses.getTransaction().commit();

        return toReturn;
    }
Andre_Fonseca

oi,

já tentou executar sem o setParameter? já verificou se esta lista de valores está correta??

abs

J

Rapaz ele retorna um Object[] com os dois objetos certinhos…Só naum sei como consigo entrar neles…

Andre_Fonseca

olhando no javadoc

você pode filtrar pelo Armario que quer pesquisar, ou entao converter um Object[] para um List o que for necessário para o seu caso…

Andre_Fonseca

oi,

caso você queira fazer a conversão pode fazer algo parecido com isso - onde foo é um Object[]

List&lt;Object&gt; armarios = Arrays.asList(foo); 
		
  for (Object object : armarios) {
    Armario arm = (Armario) object;
    List&lt;Sapato&gt; sapatos = arm.sapatos;
			
  }
Andre_Fonseca

oi,

conseguiu resolver??

J

Cara só vou poder te responder amanhã de manhã quand chegar no trampo, mas valeu pelas dicas…Amnhã confirmo se deu certo.

J

Deu java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Armario , não deu pra castiar…

J

Bem, pelo que debuguei aqui ele retorna um Object[] sim, porém, bidimensional…Estou vendo se consigo acessar essas posições, mas está difícil.

g4j

Exatamente. Bidimensional. Mas sabe o porque?

por causa disso:

from Armario o, IN (o.sapatos) as s where s.idSapato = 284"

São 2 posições por linha, a primeira é o objeto Armario “o”, a segunda é o conjunto de sapatos “s”:

Object[] list = ... retorno do hql.
Armario o = (Armario) list[0];
J

Continua dando ClassCastException… :frowning: Eu peguei na posição 0 como vc disse, porém nessa posição tem outro vetor de Object[]…estranho…

g4j

Pode postar todo o código do método que recupera a lista pra nós darmos uma olhada?

J

Solução enviada por André Fonseca e modificada por JackOld (eu):

for( int i = 0; i < resultado.size(); i++ ){

                Object[] objetos = { resultado.get(i) } ;

                List<Object> listObjetos = Arrays.asList(objetos);
                
                for( Object object : listObjetos ){

                    Object[] obj = (Object[]) object;

                    Armario armario= (Armario ) obj[0] ;

                    List<Sapatos> sapatos = armario.getSapatps();

                }

            }

VALEU A G4J E ANDRÉ FONSECA VCS SÃO SINISTROS!!! HEHE

g4j

Então cara, legal que resolveu.

Olhando o código acho que dá pra melhorar hein!

for (Iterator iterator = resultado.iterator(); iterator.hasNext();) {
			Object[] obj = (Object[]) iterator.next();
			Armario armario = (Armario) obj[0] ;  
			List<Sapatos> sapatos = armario.getSapatps();  			
		}

veja se funciona.

J

Blz, funcionou tmbm…Valeu a atenção…Isso estava me tirando o sono…

Criado 26 de janeiro de 2010
Ultima resposta 27 de jan. de 2010
Respostas 25
Participantes 3