31

如何使用命名查询获得计数,而不获取所有列表(我认为这会提高性能)。这是不起作用的命名查询:

@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
4

3 回答 3

39

像这样更改您的代码;

      int count = ((Number)em.createNamedQuery("Charakteristika.findAllCount").getSingleResult()).intValue();
      System.out.println(count);
于 2012-08-10T07:49:25.287 回答
6

您也可以尝试一下:使用具有 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();
    }
于 2016-05-01T17:55:52.430 回答
2

尝试:

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 指出的那样,查询是相同的。因此,请尝试使用上述不同形式的两个名称。

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

总得在某处给予一些东西。

于 2012-08-10T07:10:30.720 回答