Olá pessoal,
estou com um problema aqui ta dificil deu conseguir resolver, o problema é em uma consulta que envolve duas tabelas, a consulta funciona normal, o problema é na hora de fazer o cast eu nao consigo pegar o resultado da consulta para exibir em uma JTable, vo cola parte do codigo abaixo para dar pra enterder melhor:
A Consulta:
A consulta é esta acima que evolvendo duas tabelas que são Compras e Pjuridicas, ela funciona por ja testei.
O Cast:
[code]Compras actor;
Pjuridicas pes;
for(Object o : resultList) {
//O Problema acontece aqui na linha abaixo
actor = (Compras)o;
pes = (Pjuridicas) sessao.get(Pjuridicas.class, actor.getPessoas().getPesCodigo());
Vector<Object> oneRow = new Vector<Object>();
oneRow.add(actor.getComCodigo());
oneRow.add(pes.getJurFantasia());
oneRow.add("R$"+formatarFloat(Float.parseFloat(actor.getComVlrtotal().toString())));
oneRow.add(new SimpleDateFormat("dd/MM/yyyy").format(actor.getComData()));
if (actor.getComFormapagto()=='1'){
oneRow.add("À Vista");
}else{
oneRow.add("À Prazo");
}
modelo.addRow(oneRow);
}[/code]
Bom eu ja sei que eu nao poderia estar tentando converte o resultado dessa consulta em compras pq tem 2 tabelas, o problema é que eu nao sei como resolver isso
Gostaria de saber se tem algum modo de se resolver esse problema como eu pego o resultado dessa consulta para poder colocar na minha JTable???
O Exeption que retorna:
Exception occurred during event dispatching:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to hibernate.entity.Compras
at movimentacoes.dlgCompras.displayResult(dlgCompras.java:220)
at movimentacoes.dlgCompras.busca(dlgCompras.java:685)
Geralmente não trabalho com hql da mesma maneira que voce esta trabalhando.
HQL != SQL
HQL = É a fusão entre o SQL com alguns recursos do Hibernate !
Sendo assim, acredito que é legal abusar desses recursos
Por exemplo se precisar fazer oque voce esta precisando faria assim !
no meu modelo/entity acrescentava um construtor que recebe os parametros que estão vindo do SQL
public class Funcionario {
private String nome;
private String senha;
private Acesso acesso;
public Funcionario(){}
public Funcionario(String nome, String senha){
this.nome = nome;
this.senha = senha;
}
}
Na hora de criar o hql EU criaria ele assim !
public List<Funcionario> consultar(){
String query = "SELECT com.modelo.Usuario(usuario.nome, usuario.senha) FROM usuario WHERE usuario.nome=:nome";
Criteria hql = session.createQuery(query);
hql.setParamter("nome", "magno");
return hql.list;
}
Repare na linha :
String query = "SELECT new com.modelo.Usuario(usuario.nome, usuario.senha) FROM usuario WHERE usuario.nome=:nome";
Eu seleciono os campos no SQL e automaticamente instancio a classe usuario passando como parametro o nome e a senha.
Pronto nem faço um loop pra trabalhar em cima do result o hibernate ja faz td isso automaticamente !
Outro detalhe importante é a auxencia de Joins !
Se ouver relacionamentos entre classes no HQL posse pode fazer assim
String query = "SELECT new com.modelo.Compras(compras.pessoas.pesCodigo, compras.pjuridicas.jurFantasia) FROM compras ";
Voce vai andando pelos relacionamentos como se fosse java e o Hibernate se encarrega de realizar os Joins necessários !
LGWEB
eu tentei usar o seu exemplo mais nao deu certo dá tipos imcopatíveis
for(Object[] o : resultList) {
...}
MAGNOCOSTA
Vi seu exemplo e eu realmente não sabia que podia fazer isso, ainda so meio leigo em hibernate, mas eu nao intendi o que é o com.modelo.NomeDaEntidade
da onde vem o com e o modelo?
[quote=Vinny]LGWEB
eu tentei usar o seu exemplo mais nao deu certo dá tipos imcopatíveis
for(Object[] o : resultList) {
...}
MAGNOCOSTA
Vi seu exemplo e eu realmente não sabia que podia fazer isso, ainda so meio leigo em hibernate, mas eu nao intendi o que é o com.modelo.NomeDaEntidade
da onde vem o com e o modelo?
eu fui tentar usar mais empaquei nisso[/quote]
É o endereço completo do seu objeto.
Assim ele consegue instanciar.
Exemplo:
br.com.teste.model.pessoa
** Cuidado com os tipos declarados, pois se a sequencia estiver errada ou os tipos de dados forem diferentes o jpa não conseguirá instânciar seu objeto.
Query…
SELECT NEW com.company.PublisherInfo(pub.id, pub.revenue, mag.price) FROM Publisher pub JOIN pub.magazines mag WHERE mag.price > 5.00
return (List<PublisherInfo>) query.getResultList();
Perfeito para apresentação na tela, otimizações de consultas e relatórios.
Agora se o seu arquiteto fala que vc não pode usar coisas específicas do seu provedor de persistência, e
que vc tem que se ater a especificação (JPA), use construction expression. (Desabafei!!!)
rsrsrs
Muda o título do tópico…
Além de acrescentar [RESOLVIDO], coloca algo mais coerente com o contexto
Acredito que algo similar a “Como fugir do proxy do hibernate [RESOLVIDO]” ou “Consulta específica no hibernate [RESOLVIDO]” ficaria interessante.
Bom, desculpa mais ainda não posso dizer que ta resolvido, pq ta foda, eu nao uso JPA somente hibernate, descobri isso quando fui tentar fazer isso pra testa:
org.hibernate.PropertyNotFoundException: Could not find setter for codigo on class hibernate.entity.Produtos
at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44)
at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:57)
at org.hibernate.loader.criteria.CriteriaLoader.getResultColumnOrRow(CriteriaLoader.java:115)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:606)
at org.hibernate.loader.Loader.doQuery(Loader.java:701)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
at cadastros.dlgProdutos.txtChaveCaretUpdate(dlgProdutos.java:856)
não tem outra forma de resolver isso sem usar JPA, somente com hibernate?
eu tava tentando do jeito que o lgweb mas nao funciona
eu nao consigo acessa o array do object, no codigo quando eu coloca Object[] o : resultList ja fica grifado de vermelho então nem da pra rodar!
Quando eu faço a consulta que eu citei mas acima retorna o Object assim
Bom consegui axar um jeito via HQL para resolver, minha consulta so vai retornar a tabela que preciso.
ficou assim:
hql = "from Compras c "
+ " where pessoas.pesCodigo in (select jurCodigo from Pjuridicas "
+ " where jurFantasia like '%"+ txtChave.getText().toUpperCase()+"%') ";
era assim: