2012-05-11 27 views
5

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

Respuesta

2

Usted tiene básicamente tres opciones.

  1. Usa poscarga y deja que java lo haga.
  2. Utilice una tercera clase y un uso nuevo operador en la instrucción Select de JPQL llamar constructor y el interior que las llamadas Puede gestionar los tipos de datos que se transmiten a SQL, pero usted recibirá más de un tipo de objetos de atrás, que es bien, simplemente obtenga la correcta del índice de matriz .Más información sobre este here.
  3. Tercer uso de consulta nativa como Idanmo dijo.
2

yo sepa no hay una manera de hacer este tipo de molde en JPQL.

Sugiero usar la ejecución de consulta nativa de JPA, que le permite ejecutar una consulta SQL como lo haría si estuviera usando JDBC.

Por ejemplo:

Query query = em.createNativeQuery("select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2)) from Sometable"); 

Double result = (Double) query.getSingleResult(); 

o

List<Double> results = (List<Double>) query.getResultList(); 
+0

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

+0

¿Puedes por favor explicar por qué esperas que el dialecto automáticamente haga el casting? – Victor

+0

@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

3

Que el operador de división realiza la división de enteros en argumentos enteros es una característica. En MySQL tiene que elegir explícitamente div para la división de enteros y / para la división de coma flotante, mientras que en JPQL la elección se hace automáticamente como en Java.

por lo que sugiero:

select (column1 * 1.0)/column2 from Sometable; 
Cuestiones relacionadas