Tengo dos columnas Integer
en la base de datos (derby y db2). Necesito dividirlos entre sí dentro de un JPQL
.¿Cómo puedo usar el typcasting dentro de una declaración JPQL?
Ambas columnas son del tipo Integer
devuelven cero si el resto es un número decimal, por ejemplo, 0.25
se convierte en 0
etc. y es comprensible, ya que type es int.
En SQL
que podía tener este por ejemplo
select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;
pero lo que es equivalente JPQL
.
Una opción podría ser (no he probado todavía) es tener un método @Transient
en la entidad de devolver el tipo decimal y hacer este cálculo allí y pasar a que JPQL
pero preferiría dejar que SQL
hacer este trabajo.
Mysql no requiere conversión a nivel de base de datos. Así que el comportamiento para diferentes RDBMS es diferente, lo cual está bien. Pero, ¿qué debería hacer JPQL sin la necesidad de utilizar una consulta nativa para saber que se necesita conversión a decimal para esta operación?
Añadiendo el dialecto <property name="openjpa.jdbc.DBDictionary" value="derby"/>
tampoco lo corrigió.
Tenga en cuenta que es JPA1
Hubiera esperado que div/operator devolviera un decimal sin necesidad de un molde, pero eso no sucederá. La configuración del dialecto también debería haber solucionado este problema, pero no es el caso. También me estoy inclinando por la tecnología de búsqueda nativa, pero aún no estoy convencido de que no sea solo una opción. Si es así, eso es realmente triste. +1. – Shahzeb
¿Puedes por favor explicar por qué esperas que el dialecto automáticamente haga el casting? – Victor
@Kaushik porque la división de dos enteros produce un tipo de datos diferente según la base de datos subyacente. Por ejemplo 'Mysql' devuelve un decimal donde como' Derby' y 'DB2' entero que cambia' 0.25' por '0' por ejemplo. Por lo tanto, el dialecto debe conocer el comportamiento y proporcionar un maquinismo especialmente dado que la opción de un elenco no está disponible en 'JPQL '. – Shahzeb