2012-08-10 53 views
26

如何獲得一個namedquery的計數,而不必獲取所有列表(它會提高我認爲的性能)。這是指定的查詢不起作用:JPA count NamedQuery

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

執行此:

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

輸出:

a 

雖然這個查詢工作:

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

執行這個:

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

輸出:

a 
11111 
b 
+2

@JBNizet查詢是相同的,執行是不同的。 – 2012-08-10 07:10:22

+0

我很抱歉,問題仍然是一樣的,只是拼寫錯誤的第二個查詢。 – Minutis 2012-08-10 07:16:54

+0

@JBNizet第二次執行指定結果類型爲「Charakteristika.class」;我猜測那是拋出一些東西,爲每個'N'行返回一個計數。 – 2012-08-10 07:23:24

回答

32

更改您的代碼喜歡這個;

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

您輸出結果的數字類是什麼? 不應該是(int)? – 2014-03-04 01:30:48

1

嘗試:

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

,看看它的輸出暗示你什麼都好。

做不到這一點,

  • 嘗試getResultList,而不是getSingleResult;否則一樣。

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

  • 探索查詢聲明差異;正如JB指出的那樣,查詢是一樣的。因此,請嘗試使用上述不同形式的名稱。

  • 檢查你是如何建設;是部署應用程序的這部分?單機?

某些東西需要放棄。

+0

沒有。沒有結果,沒有錯誤,只是在輸出「a」後離開。 – Minutis 2012-08-10 07:15:29

4

你也可以嘗試一下:使用TypeQuery接口和Long值。在下一個示例中,「PosicionHistorialDia.findNumberSpeeding」查詢是一個jpa計數。

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