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 @MappedSuperclass 子类的不同 Id 计数器
使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列