2012-08-10 15 views
26

cómo obtener la cuenta con una consulta especificada, sin obtener toda la lista (aumentaría el rendimiento, creo). Esta es la consulta con nombre que no funciona:Contador de JPA NamedQuery

@NamedQuery(name = "Charakteristika.findAllCount", query = "SELECT COUNT(c) FROM Charakteristika c") 

La ejecución de esta:

System.out.println("a"); 
System.out.println(em.createNamedQuery("Charakteristika.findAllCount", Integer.class).getSingleResult().intValue()); 
System.out.println("b"); 

Salida:

a 

Aunque esta consulta funciona:

@NamedQuery(name = "Charakteristika.findAll", query = "SELECT c FROM Charakteristika c") 

Ejecución esto:

System.out.println("a"); 
System.out.println(em.createNamedQuery("Charakteristika.findAll", Charakteristika.class).getResultList().size()); 
System.out.println("b"); 

Salida:

a 
11111 
b 
+2

@JBNizet Las consultas son las mismas, la ejecución es diferente. –

+0

Lo siento mucho, el problema sigue siendo el mismo, solo una segunda consulta mal escrita. – Minutis

+0

@JBNizet La segunda ejecución especifica que el tipo de resultado es 'Charakteristika.class'; Supongo que se está tirando cosas, devolviendo un conteo para cada una de las filas 'N'. –

Respuesta

32

Cambie su código le gusta esto;

 int count = ((Number)em.createNamedQuery("Charakteristika.findAllCount").getSingleResult()).intValue(); 
     System.out.println(count); 
+2

¿Cuál es la clase de Número que está arrojando el resultado también? ¿No debería ser (int)? –

1

Probar:

System.out.println("a"); 
System.out.println(em.createNamedQuery("Charakteristika.findAllCount").getSingleResult()); 
System.out.println("b"); 

Y ver si es de salida sugiere nada.

De no ser así,

  • tratar getResultList en lugar de getSingleResult; de lo contrario, lo mismo.

  • tratar createQuery("SELECT COUNT(c) FROM Charakteristika c").getSingleResult & getResultList

  • explorar las diferencias en la declaración de las consultas; como señala JB, las consultas son las mismas. Por lo tanto, pruebe ambos nombres con las diferentes formas anteriores.

  • Examine cómo está compilando; ¿Es esta parte de una aplicación implementada? ¿ser único?

Algo tiene que dar en alguna parte.

+0

No. Ningún resultado, ningún error, solo deja colgando después de sacar "a". – Minutis

4

También puede probarlo: use la interfaz TypeQuery con Long value. En el siguiente ejemplo, la consulta "PosicionHistorialDia.findNumberSpeeding" es un recuento de jpa.

@Override 
    public Long findCount(String eventCode) { 
     TypedQuery<Long> query = em.createNamedQuery(
      "PosicionHistorialDia.findNumberSpeeding", 
      Long.class); 
     query.setParameter("event", eventCode); 
     return query.getSingleResult(); 
    } 
Cuestiones relacionadas