[Hibernate] ResultTransfomer

Olá galera,

Estou começando a usar ResultTransformer nos meus HQLs agora, só que implementando percebi que preciso colocar alias no campo dos selects para o Hibernate saber qual setter ele vai usar, caso eu não coloque nenhum Alias ele procura um atributo 0.
Por exemplo:
Funciona:

"Select idItemOrdemPagamento as idItemOrdemPagamento, valor as valor From OPMovimento Where ordemPagamento.fornecedor.idFornecedor_cp = " + id

Não funciona:

"Select idItemOrdemPagamento as idItemOrdemPagamento, valor as valor From OPMovimento Where ordemPagamento.fornecedor.idFornecedor_cp = " + id.toString()

Exibe o seguinte erro:

org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class br.sap.tesouraria.entidade.OPMovimento

Existe uma maneira de fazer o HQL sem ter que colocar os Alias?

Além disso,

no caso do fazer um join como eu vou informar de quem é o setter, por exemplo:

"Select m.idMovimentoEntrada as idMovimentoEntrada, m.data as data, m.valor as valor From OPMovimento o Left Join o.movimentoEntrada m Where o.idItemOrdemPagamento = " + opm.getIdItemOrdemPagamento()

Desde já agradeço a atenção

"Select idItemOrdemPagamento as idItemOrdemPagamento, valor as valor From OPMovimento Where ordemPagamento.fornecedor.idFornecedor_cp = " + id

isso ai significa que vc ta contactenando um parametro a String hql?? se sim, vc pode usar :id ao inves disso, ficando assim

"Select idItemOrdemPagamento as idItemOrdemPagamento, valor as valor From OPMovimento Where ordemPagamento.fornecedor.idFornecedor_cp = :id"

em seguida vc da um query.setParameter("id",id)
onde o primeiro valor do método é o nome do parametro da sua query e o segundo é o valor que esse parametro deve receber, os alias não interferem em nada na execução da sua query, e são necessários se vc está usando result transformer

Ah blza são sim cara, eu só n uso setando pq a maneira que foi montado esse projeto eu não estou setando isso dieratamente numa Query, mas sim numa string consulta que joga isso para uma classe DAO que monta a query com essa String e daí sim executa, enfim sei que dá para fazer, mas não dá para mexer nisso agora rsrs.

A dúvida que estou aqui é: Quando eu uso result transformer eu tenho que usar Alias? Porque dos exemplos que eu vi aqui no GUJ tinha gente que não usava, além disso como montar um objeto dentro do outro:

Select p.nome, p.idade, e.logradouro, from Pessoa p inner join p.endereco e 

Dá para fazer isso, sendo que o Hibernate criaria uma instância de Endereco dentro de Pessoa com o campo logradouro preenchido?

Obrigado

Bom, até onde eu sei precisa do alias sim, mas pode ser que eu esteja enganado.

Quanto a sua dúvida ai, da pra fazer isso sim

rsrs mas, como é que faz? poque eu to tendo que colocar o Alias do campo e não da para fazer logradouro as logradouro e nem e.logradouro as e.logradouro, ele não consegue achar o setter certo. O que estou fazendo errado?

humm, eu acredito que é por causa da relação, no caso vc faria e.logradouro as endereco_logradouro

os alias, ao usar result transformer, devem ter os mesmos nomes das propriedades na classe, no caso do endereço, vc informa a relação dela em pessoa “endereco” e depois o nome do atributo dentro de endereco “logradouro”

Tenta ai que eu acho que da certo.

Cara não deu certo

org.hibernate.PropertyNotFoundException: Could not find setter for m_data on class br.sap.tesouraria.entidade.OPMovimento

vou colocar a query:

"Select m.data as m_data, m.valor as m_valor, m.contaCredito as m_contaCredito From OPMovimento o left join o.movimentoEntrada m  Where o.idItemOrdemPagamento = " + opm.getIdItemOrdemPagamento()

não ligue para os campos é só um rascunho rs

obrigado denovo

eu acredito que é porque vc ta usando o apelido dando a entidade ao inves do nome do atributo que referencia a entidade dentro da sua entidade principal, essa sua query, o certo seria mais ou menos assim

"Select m.data as movimentoEntrada_data, m.valor as movimentoEntrada_valor, m.contaCredito as movimentoEntrada_contaCredito From OPMovimento o left join o.movimentoEntrada m  Where o.idItemOrdemPagamento = " + opm.getIdItemOrdemPagamento()

trocando o apelido (m) pelo nome do atributo (movimentoEntrada) que está dentro da classe que vc ta efetuando a pesquisa (OPMovimento)
tenta ai

Desculpa cara msm erro: não pode achar o setter para movimentoEntrada_data

Porém se eu usar só o preenchimento da classe MovimentoEntrada, passando essa classe dentro do Transformer e etc, sem preencher várias classes funciona, deve ter outra maneira de fazer esse Alias

posta seu DAO inteiro pra gente dar uma analisada

Esse é o metodo DAO genérico que roda as consultas. A assinatura dele é:

public Object buscarUm(Object consulta, Class<?> entidade, Session s) throws SQLException {

dai executa:

Query query = getSession().createQuery((String) consulta); query.setResultTransformer(Transformers.aliasToBean(entidade)); Object retorno = query.uniqueResult();

e na chamada dele, que é aquela parte que você já viu fica:

MovimentoEntrada me = (MovimentoEntrada) getClassDAO().buscarUm("Select m.data as movimentoEntrada_data, m.valor as movimentoEntrada_valor, m.contaCredito as movimentoEntrada_contaCredito From OPMovimento o left join o.movimentoEntrada m  Where o.idItemOrdemPagamento = " + opm.getIdItemOrdemPagamento(), OPMovimento.class, null);

Cara, eu ACHO que ta dando erro pq sua query vc da um select from OPMovimento, e passa como classe uma OPMovimento e a consulta, com isso, ta te retornando um objeto do tipo OPMovimento e vc ta tentando atribuir ele a uma variavel que referencia um MovimentoEntrada,

ai eu tenho duas dicas pra vc…
1 - vc cria uma referencia a um objeto OPMovimento, e pega os atributos que vc quer assim

opm.getMovimentoEntrada.getData();
//e assim por diante

2 - se dentro da sua MovimentoEntrada vc tem algum atributo que referencie OPMovimento, faça a consulta a partir de ME e com isso retorne um objeto ME.

mesmo seu retorno sendo Object o que vem é um OPM e não um ME

Pois é dentro de uma opm já tem um movimentoEntrada, nesse caso específico eu só peguei dados do me, mas o certo mesmo seria pegar dados dos dois. Tipo trazer os dados da OPMovimento, mas a mesma tela usa dados do MovimentoEntrada por isso todas na mesma query. Essa questão da primeira solução eu até posso fazer
opm.getMovimentoEntrada.getData();
mas, a questão é preencher isso num HQL só

Me parece que ta certo do jeito que vc ta fazendo, vc só tem que fazer um objeto do tipo OPMovimento receber o resultado da query ao inves de um MovimentoEntrada, penso eu que se vc fizer dessa maneira funcione, ai vc acessa os dados da ME atraves do seu objeto OPM.

Foi a primeira coisa que tentei, mas o estranho é que o erro não é conversão de dados, mas sim de não conseguir localizar o setter.

org.hibernate.PropertyNotFoundException: Could not find setter for ordemPagamento_data on class br.sap.tesouraria.entidade.OPMovimento

Nesse caso ai estou tentando setar um atributo data na ordem de pagamento. A classe que estou passando para o Transformer é a OPMovimento e também é a classe que estou recebendo. Claro se eu tirar a parte da consulta de

ordemPagamento.data as ordemPagamento_data funciona normalmente. Abaixo a consulta toda:

List<OPMovimento> lstOm = srvOpm.getClassDAO().buscarN("Select idItemOrdemPagamento as idItemOrdemPagamento, valor as valor, ordemPagamento.data as ordemPagamento_data From OPMovimento Where ordemPagamento.fornecedor.idFornecedor_cp = " + id, OPMovimento.class, null);

Vou dar mais uma tentada, caso vc ache alguma coisa por favor me fale

abração cara, vlw