Dúvida com o método javax.persistence.Query.setParameter(String, Object) do EJB3

5 respostas
pgioseffi

Prezados,

Eu tenho uma query que utiliza pra comparação uma coluna com dados do tipo ponto flutuante. Até aí sem problemas, usamos aqui para essas comparações o objeto Double e tudo funciona redondo.

Porém, identificamos perdas financeiras pela incapacidade da JVM de interpretar valores decimais como 0.1 em binário, pois este valor convertido para binário é uma dízima não periódica e depois de sucessões de operações em cima deste valor podemos ter perda (ou ganho de valores).

Com isso tivemos que parar de usar o objeto Double (ou o intrínseco double) para usarmos o BigDecimal como alternativa, sempre instanciando o BigDecimal pelo seu construtor que recebe como parâmetro uma String para não cairmos no mesmo problema acima. Ao usar o construtor que recebe um double, o próprio JavaDoc diz que podemos esperar um valor inesperado.

Enfim, eu queria saber se para o EJB podemos comparar valores de ponto flutuante utilizando BigDecimal da mesma forma que utilizamos Double, ou se teríamos que usar um workaround e converter o BigDecimal em Double.

Alguém saberia me responder?

5 Respostas

maior_abandonado

você diz comparação na clausula where da sua ejbql?

eu não tenho certeza se você pode usar o método que você disse no titulo do tópico com um BigDecimal no segundo parâmetro, sei que a classe Query do hibernate tem um método setBigDecimal mais no caso do jpa no javax.persistence eu não tenho certeza… de repente até compensa o teste, usa BigDecimal e ve se funciona, testa em algum caso como com 0.1 por exemplo para ver se você tem alguma surpresa (se não der nenhuma exceção acredito que funcione).

pgioseffi

maior_abandonado,

Acho que vc acabou com a mesma dúvida q eu então…

Eu ainda tô chegando na fase de tirar os erros de compilação do projeto…

É muito Double se tornando BigDecimal no refactor, tentei só adiantar essa dúvida mesmo antes de testar, mas acho que não vai ter jeito e vou ter que resolver tudo na unha e tirar a dúvida só em tempo de execução mesmo…

De qualquer forma, obrigado!

fabiocsilva

Em tese funciona algo do tipo select e from Employee where salary > 5000
O problema é que esse cálculo será feito no banco de dados, então use um banco(e um driver JDBC) decente.

pgioseffi

Driver JDBC com EJB?

fabiocsilva

Se você for ler ou gravar a informação em um banco de dados em algum momento ela vai passar por um driver JDBC. Aqui vai um link de como configurar no JBoss:http://docs.jboss.org/jbossas/getting_started/v5/html_single/#db.

Criado 1 de junho de 2011
Ultima resposta 1 de jun. de 2011
Respostas 5
Participantes 3