JPA 计数 NamedQuery

Posted

技术标签:

【中文标题】JPA 计数 NamedQuery【英文标题】:JPA count NamedQuery 【发布时间】:2012-08-10 06:59:35 【问题描述】:

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

@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

【问题讨论】:

@JBNizet 查询相同,执行不同。 非常抱歉,问题还是一样,只是第二个查询拼错了。 @JBNizet 第二次执行指定结果类型为Charakteristika.class;我猜这是把事情扔掉,为N 行中的每一行返回一个计数。 @Minutis 通常看起来很合理,所以我认为更多信息可能会有所帮助 - 你的运行时环境是什么? JPA 引擎、版本等? @Minutis: 哪个问题?告诉我们会发生什么。 【参考方案1】:

像这样更改你的代码;

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

【讨论】:

你要转换结果的 Number 类是什么?不应该是 (int) 吗?【参考方案2】:

您也可以尝试一下:使用带有 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();
    

【讨论】:

【参考方案3】:

试试:

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

检查您的构建方式;这是已部署应用程序的一部分吗?单机?

总得在某处付出。

【讨论】:

不。没有结果,没有错误,只是在输出“a”后挂起。

以上是关于JPA 计数 NamedQuery的主要内容,如果未能解决你的问题,请参考以下文章

获取计数并产生一个查询 JPA

如何在 JPA 中使用 NamedQuery

JPA @MappedSuperclass 子类的不同 Id 计数器

使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列

为啥元字符 * 不能在 JPA 的实体中的 NamedQuery 中使用?

从 JPA 实体的接口中检索 @NamedQuery