JPA计数NamedQuery

时间:2012-08-10 06:59:35

标签: java jpa named-query

如何使用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

3 个答案:

答案 0 :(得分:36)

像这样更改您的代码;

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

答案 1 :(得分:4)

您也可以尝试:使用带有Long值的TypeQuery接口。在下一个示例中,“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();
    }

答案 2 :(得分: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&amp; getResultList

  • 探索查询声明的差异;正如JB指出的那样,查询是一样的。因此,请尝试使用上述不同形式的两个名称。

  • 检查你是如何建造的;这是部署应用程序的一部分吗?单机?

某些东西必须放在某处。