Problema com consulta nativa do JPA (falha ao converter [])

12 respostas
P

Pessoal,

Vejam, tenho em uma classe Dao este método:

public List<Object []> listB() {       
        Query query = entityManager.createNativeQuery("SELECT ITEM, ASSET, NAME, STATUS, DESCRIPTION FROM ADMIN.ASSET WHERE ASSET_TYPE_REF = 3 AND STATUS = 'A'");
        return query.getResultList();
    }

e depois chamo ele e tento pegar os valores assim:

public void printB() {
        List<Object[]> listBrasInfra = daoInfra.listBras();
        Iterator listIterator = listBrasInfra.iterator();
        while (listIterator.hasNext()) {
            Object[] row = (Object[]) listIterator.next();
            System.out.println(row[0]);
        }
    }

Quando rodo a aplicação recebo este erro:

Caused by: java.lang.ClassCastException: java.util.Vector cannot be cast to [Ljava.lang.Object;

Alguém sabe o porque disso:? O interessante é que se eu mando printar os valores do iterator vai blz…

12 Respostas

Rodrigo_Sasaki

algum motivo pra você querer uma Lista de Array de Object?

só um detalhe… um Array também é um object. Object obj = new Object[10]; Isso compila.

P

Poderia me explicar melhor?

Rodrigo_Sasaki

Claro :slight_smile:

você está gerando uma lista de Arrays de Objects, certo?

provavelmente vai iterar essa lista, e iterar o array também, não sei. Mas vamos para o básico

Lembra quando falaram que todo mundo herda de Object? ou seja, Object é o primeirão, se você for subindo na cadeia de herança de qualquer classe, alguma hora chega nele.

O mesmo é valido para um array, um array de qualquer coisa também é um Object. Não sei se expliquei muito bem , deu pra entender?

mas enfim, isso não parece ser o causador do seu erro. você pode explicar melhor o por que precisa de um Array de Object?

P

Preciso do array para pegar os campos da consulta no banco.

Rodrigo_Sasaki

Mas é uma lista de arrays mesmo?

lista.get(0) = {01, 02, 03}

lista.get(1) = {11, 12, 13}

lista.get(2) = {21, 22, 23}

lista.get(3) = {31, 32, 33}

uma estrutura parecida com essa?

Dentro de cada item da sua lista você vai ter um array? Porque pela sua query, não me parece correto.

P

isto para cada item da list eu tenho um array.

P

Veja estou seguindo exatamente um tutorial:

Iterator<Object[]> results = em.createQuery(
        "select cat.color, min(cat.birthdate), count(cat) from Cat cat " +
        "group by cat.color")
        .getResultList()
        .iterator();

while ( results.hasNext() ) {
    Object[] row = results.next();
    Color type = (Color) row[0];
    Date oldest = (Date) row[1];
    Integer count = (Integer) row[2];
    .....
}
Rodrigo_Sasaki

nunca fiz dessa maneira, por que não instancia um Iterator<Object[]> como está no seu tutorial?

O erro está justamente no cast.

P

Digao,

Foi o que eu fiz

veja, esta assim:

public void printB() {
        List listBrasInfra = daoInfra.listBras();
        Iterator<Object[]> results = listBrasInfra.iterator();
        
        while(results.hasNext()){
            Object [] row = results.next();
            Integer cod = (Integer) row[0];
        }
        
    }
Rodrigo_Sasaki

Não não, no seu exemplo a query alimenta diretamente o Iterator<Object[]>, no seu caso você popula uma lista primeiro.

Outra (provável) solução seria remover o cast que você faz na atribuição. O seu problema está em tentar fazer um cast de java.util.Vector para um array de Object.

P

fiz igualzinho do tutorial, mesmo erro…

P

Digão…

Usando um pouco a cabeça consegui resolver…

Ao inves de retornar um Iterator<Object[]> fiz ele retornar um Iterator, porque fiz assim, desta forma ele nao vai converter de Vector para Object.

Não sei se tem a ver, mas o tutorial que eu segui é do JPA sendo implmentado pelo Hibernate, porém estou usando o Toplink da Oracle…

Cara… valeu pela ajuda!!!

Criado 5 de junho de 2012
Ultima resposta 5 de jun. de 2012
Respostas 12
Participantes 2