使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列
Posted
技术标签:
【中文标题】使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列【英文标题】:JPA count(*) using CriteriaBuilder. How to use CriteriaBuilder to retrive the count(*) column 【发布时间】:2019-04-10 17:26:25 【问题描述】:我有一个关于 CriteriaBuilder API 的问题:
我想计算一列的结果,并返回该计数的结果和该列的不同值的列表。
| Table_fruit | count(Table_fruit) |
|------------------------|---------------------------|
| apple | (5) |
| orange | (20) |
| banana | (400) |
所以我想做一个查询来执行这个 SQL 语句:
select distinct COLUMN_NAME_1, count(COLUMN_NAME_1)
from TABLE_NAME
where COLUMN_NAME_2= 'value'
group by COLUMN_NAME_1;
CriteriaBuilder cb = getCriteriaBuilder();
CriteriaQuery<Fruit> cq = cb.createQuery(Fruit.class);
Root<TABLE_NAME> root = cq.from(Fruit.class);
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("COLUMN_NAME_2"), value));
cq.where(predicates.toArray(new Predicate[predicates.size()]));
// how to select the COUNT(*) from the table here?
cq.select(root.get("COLUMN_NAME_1")).distinct(true);
cq.groupBy(root.get("COLUMN_NAME_1"));
所以我的问题是:如何从 Java 中的查询中检索两个值
【问题讨论】:
【参考方案1】:试试这个
cq.multiselect(root.get("COLUMN_NAME_1"), cb.count(root.get("COLUMN_NAME_1"));
// add your predicates here
cq.groupBy(root.get("COLUMN_NAME_1"));
【讨论】:
【参考方案2】:1) 将泛型更改为:CriteriaQuery<Object[]> cq = cb.createQuery(Object[]);
2) 更改选择:cq.select(cb.count(root), root.get("COLUMN_NAME_1"))
3) 迭代结果列表:
List<Object[]> results = em.createQuery(cq).getResultList();
for (Object[] result : results)
// actions
【讨论】:
以上是关于使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列的主要内容,如果未能解决你的问题,请参考以下文章
JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?
JPA CriteriaBuilder - 如何使用“IN”比较运算符
如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?
如何在 JPA Criteriabuilder Select 语句中执行子查询?