2012-05-31 7 views
7

He siguiente método:APP getResultList() devuelve BigInteger para MySQL, pero entero para el servidor Microsoft SQL

Query q = getEntityManager().createNativeQuery("SELECT COUNT(1) FROM table1 WHERE column = :column_id " + "UNION " + "SELECT COUNT(1) FROM table2 WHERE column = :column_id"); 
q.setParameter("column_id", column_id); 

Cuando quiero obtener la lista de cuentas (que será de 2 filas), llevo a cabo esta acción :

List<BigInteger> counts = (List<BigInteger>) q.getResultList(); 

Esto funciona bien en MySQL. Pero tan pronto como me conecto al servidor de MS SQL, estoy obteniendo una lista de objetos Integer:

List<Integer> 

Cualquier idea de por qué hay una diferencia?

+0

Su título es al revés. – Hassan

+0

¿Qué implementación de JPA usa? –

+0

¿Intentó explícitamente establecer el tipo de retorno esperado como 'getEntityManager(). CreateNativeQuery (" SELECT COUNT (1) FROM table1 WHERE column =: column_id "+" UNION "+" SELECT COUNT (1) FROM table2 WHERE column =: column_id ", Integer.class);' –

Respuesta

17

JPA define los tipos de devolución para las consultas JPQL, pero para las consultas SQL nativas se obtiene lo que devuelve la base de datos. Ese es el punto con las consultas SQL nativas.

cambiar su código de Número,

List<Number> counts = (List<Number>) q.getResultList(); 
long count = counts.get(0).longValue(); 
+0

Gracias James, ¡tu solución es la solución! :-) –

0

se define serverside

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count

"devuelve un recuento del número de valores no nulos de expr en las filas recuperadas por una instrucción SELECT. El resultado es un valor BIGINT."

http://msdn.microsoft.com/en-us/library/aa258232%28v=sql.80%29

"Return Tipos

int"

+0

Hmmm ... pero, ¿no es JPA todo acerca de separar las capas de la base de datos de las capas de procesamiento? ¿Cómo puedo obtener un resultado uniforme? Solo quiero usar BigInteger OR Integer. No me importa cuál, solo 1 :-) –

+0

como AhamedMusatafaM dijo, ¿has intentado Query q = getEntityManager(). CreateNativeQuery ("SELECT COUNT (1) FROM table1 WHERE column =: column_id" + "UNION" + "SELECT COUNT (1) FROM table2 WHERE column =: column_id", Integer.class); – tagtraeumer

+2

tagtraeumer: si pruebo eso, obtengo: javax.persistence.PersistenceException: org.hibernate.MappingException: entidad desconocida: java.lang.Integer –

Cuestiones relacionadas