Criteria em Hibernate: como comparo campos do tipo Float?

3 respostas
Tchello

Boa tarde galera!

Bom, tenho a seguinte situação: estou tentando fazer uma pesquisa com Criteria e Restrictions em Hibernate e não consigo fazer uma comparação em um campo do tipo Float.
Fiz alguns debugs e as variaveis estão todas corretas, mas sempre que eu informo uma comparação com o campo do tipo float o criteria não retorna registro algum.
Segue o método de pesquisa:

public List<NFComprasVO> pesquisarNFCompra(int i_id,
            String i_empresa, int i_numeronf, String i_referencia,
            float i_valortotal, String i_nomefantasia, String i_razaosocial,
            String i_dataemissao, String i_datavencimento) throws Exception {  //não olhem assim pra mim, pediram o método desse jeito...
        try {

            HibernateEntityManager hibernate = (HibernateEntityManager) em;
            Session session = hibernate.getSession();
            Criteria criteria = session.createCriteria(NFComprasVO.class);

            criteria.createAlias("fornecedor", "fornecedorAlias");


            if (i_valortotal != 0) {
                criteria.add(Restrictions.eq("valortotalnota", new Float(i_valortotal))); //AQUI !!!
            }

            //outras comparações...

            criteria.setResultTransformer(criteria.DISTINCT_ROOT_ENTITY); 

            return (List<NFComprasVO>) criteria.list();
        } catch (Exception ex) {
            throw new Exception(ex.getMessage() + FONTE + "pesquisarNFCompra()");
        }
    }

Tooda vez que ele cai naquele bloco de comparação de valortotal ele não retorna registros… nos debugs a variavel i_valortotal apareceu EXATAMENTE com o mesmo valor (em float) que esta persistido na base de dados e ainda assim a comparação não funciona.
Já tentei sem esse ‘new Float(i_valortotal)’ e também não obtive sucesso.

Alguma dica?

3 Respostas

L

Dá uma olhada no mapeamento do hibernate se lá na propriedade está mapeado como float.

T

Cuidado - comparar 2 números float (ou Float) é sujeito a erros. Por exemplo, 1.0 não deve ser exatamente igual a 3 * (1.0 / 3.0).

Tchello

Então, na entidade está dessa forma:

...
    @Column(name="valortotalnota")
    private float valortotalnota;
  ...

Fiz um System.out e a comparação deu resutados idênticos: 2.23 e 2.23… eu envio os números direto, sem cálculo.

Alguma sugestão? Ainda não ta indo =/

Vlww abraços!

edit: correção no código, não estou com o source nesse momento.

Criado 30 de março de 2009
Ultima resposta 30 de mar. de 2009
Respostas 3
Participantes 3