Pessoal, não sei se isso tá no local certo pq mistura o hibernate na historia, mas vamos lá.
Eu tenho uma pesquisa SQL que me retorna dentro do Array o ID e o valor do banco. Eu preciso pegar apenas o valor (double) que tá dentro do array e colocar dentro de uma variavel para fazer uns calculos. Como eu faço isso??? Meu codigo tá assim:
Voce está se confundindo com o tipo de retorno da lista…
Do jeito que está, você vai ter uma lista de objetos FluxoCaixa, então é só usar os objetos… assim:
[code] FluxoCaixa trocaValor = null; // alterei o tipo de variavel
FluxoCaixa trocaSaldo = null; // alterei o tipo de variavel
ArrayList<FluxoCaixa> calculoValor = (ArrayList<FluxoCaixa>) session.createSQLQuery("select MAX(id -1), valor from tb_fluxocaixa").list();
ArrayList<FluxoCaixa> calculoSaldo = (ArrayList<FluxoCaixa>) session.createSQLQuery("select MAX(id), saldo from tb_fluxocaixa").list();
trocaValor = calculoValor.get(0);
trocaSaldo = calculoSaldo.get(0);
// aqui vc usa os metodos do seu objeto FluxoCaixa
Double calValor = (Double) trocaValor.getValor(); // chutei um metodo, supondo que ele retorna Double...
Double calSaldo = (Double) trocaSaldo.getValor(); // chutei um metodo, supondo que ele retorna Double...[/code]
java.lang.ClassCastException : [Ljava.lang.Object; cannot be cast to br.com.estudo.model.FluxoCaixa" faultCode=“Server.Processing” faultDetail=“null”]
Quando eu dou o calculoValor.get(0) ele me apresenta dois valores. O primeiro valor que é o ID que eu nao me interesso, quero o segundo que é o valor em double para fazer a subtração.
Aposto que o seu problema está nesta linha : session.createSQLQuery("select MAX(id -1), valor from tb_fluxocaixa").list();
Pois : java.lang.ClassCastException : [Ljava.lang.Object; cannot be cast to br.com.estudo.model.FluxoCaixa" faultCode="Server.Processing" faultDetail="null"]
Está indicando que você não pode efetuar uma “transformação” de um Objeto em FluxoCaixa.
Adicione um System.out.println(“Passei”); após estas linhas e veja se ele consegue realizar o cast.
Edit: debug e veja exatamente o tipo de objeto que o session.createSQLQuery("").list(); retorna.
Eu fiz o debug e ele retorna um array com valores no indice de posição 0 ( ok, até ai é normal). Os valores que ele retorna são os que eu quero ( continua tudo normal) só que eu quero pegar de dentro desse array o atributo valor. Ele me dá erro de cast dizendo que o nao pode fazer cast de Object para FluxoCaixa.
Seria esta a linha causadora da exceção, certo? trocaValor = calculoValor.get(0);
Por isto estou questionando se a sua Query realmente está retornando um Objeto do tipo “FluxoCaixa”, pois vamos supor que sua lista estivesse realmente preenchida com este tipo de Objeto, não iria gerar um erro de Cast.
O provavél é que esta lista não contenha objetos FluxoCaixa, mesmo ela estando definida desta forma.
Execute um “foreach” na sua lista e um “System.out.println” e veja os resultados que ela vai retornar. Você precisa debugar e confirmar o tipo de Objeto que está sendo retornado.
É o seguinte… o problema está naquela linha do SQL sim, eu não tinha reparado no “MAX” que você estava fazendo…
O que acontece: quando você usa Hibernate, tem que prestar atenção aos select’s que você escreve… no seu caso, você não está selecionando um “objeto” FluxoCaixa do banco de dados, você personalizou o seu SQL e está retornando apenas alguns campos, um campo calculado… esse campo vai te retornar o quê? Um valor apenas, e não uma representação do objeto FluxoCaixa…
Você tem duas opções…
1- ajusta o select e tira esse MAX, pra ele poder retornar um objeto do tipo FluxoCaixa, e tem que setar o tipo de classe associada ao retorno do SQL, desta maneira:
session.createSQLQuery("select fc.id, fc.valor from tb_fluxocaixa fc where fc.id=(select max (fca.id) from t_fluxocaixa fca)").addEntity(FluxoCaixa.class).list();
2- Torna a sua lista genérica, sem tipo definido, assim:
List calculoValor = session.createSQLQuery("select MAX(id -1), valor from tb_fluxocaixa").list();
Pois é Marcelo, sei que o tu comentou está correto só que como é projeto para a empresa em que trabalho,sou o único programador java dela, o prazo do projeto já estourou e eu não tenho tempo algum para ficar estudando a melhor prática para fazer funcionar, acabei misturando para achar o resultado.
Falando em misturar resolvi o problema da seguinte forma:
[code] ArrayList calculoValor = (ArrayList) session.createSQLQuery(“select valor from tb_fluxocaixa where id= (select MAX(id-1) from tb_fluxocaixa)”).list();
Double[] trans = new Double[5];
trans[0] = (Double) ((ArrayList) calculoValor).get(0);
Double novoValor = trans[0]; [/code]