JPA计数NamedQuery

33

如何使用命名查询获取计数,而不必获取整个列表(这样可以提高性能)。以下是不起作用的命名查询:

@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 这些查询是相同的,但执行方式不同。 - Richard Sitze
非常抱歉,问题仍然存在,只是第二个查询拼写错误。 - Minutis
@JBNizet 第二次执行指定了结果类型为 Charakteristika.class,我猜这会引起问题,返回每个 N 行的计数。 - Richard Sitze
@Minutis 一般看起来还可以,所以我认为更多的信息可能会有帮助 - 您的运行环境是什么?JPA 引擎、版本等等? - Richard Sitze
@Minutis:哪个问题?告诉我们发生了什么。 - JB Nizet
4个回答

40

将您的代码更改为此:

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

3
你要将结果强制转换为哪个Number类?应该是(int)吗? - Daniel Jonker

6

同时,您可以尝试使用具有长整型值的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

尝试:

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").getSingleResultgetResultList

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

  • 检查您正在构建的方式;这是部署的应用程序的一部分吗?独立运行?

总之,一定有地方需要改进。


没有结果,也没有错误,只是在输出“a”后停留。 - Minutis

0
另一个选择
@NamedQuery(name = "MyTable.countAll", query = "SELECT COUNT(*) FROM MyTable")

long total = entityManager.createNamedQuery("MyTable.countAll", Long.class).getSingleResult();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接