2012-08-10 45 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(); 
    }