JPA 计数 NamedQuery

2022-09-01 10:44:46

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

@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

答案 1

像这样改变你的代码;

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

答案 2

您也可以尝试一下:使用具有长值的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();
    }

推荐