【问题标题】:JPA count NamedQueryJPA 计数 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: 哪个问题?告诉我们会发生什么。

标签: java jpa named-query


【解决方案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”后挂起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2016-12-26
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多