mysql - 统计JPA中使用 "group by"和 "having"过滤的行数

标签 mysql hibernate jpa eclipselink jpa-2.1

我在 MySQL 数据库中有两个表。

  • 产品
  • 订单商品

客户下的产品订单存储在 order_item 表中 - 从 productorder_item 的一对多关系。

<小时/>

目前,我正在执行以下查询。

SELECT t0.prod_id, 
       sum(t1.quantity_ordered) 
FROM   projectdb.product t0, 
       projectdb.order_item t1 
WHERE  (t0.prod_id = t1.prod_id) 
GROUP  BY t0.prod_id 
HAVING (sum(t1.quantity_ordered) >= ?) 
ORDER  BY sum(t1.quantity_ordered) DESC 

生成此 SQL 的条件查询如下。

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]>criteriaQuery=criteriaBuilder.createQuery(Object[].class);
Metamodel metamodel = entityManager.getMetamodel();
Root<OrderItem> root = criteriaQuery.from(metamodel.entity(OrderItem.class));

Join<OrderItem, Product> orderItemProdJoin = root.join(OrderItem_.prodId, JoinType.INNER);

List<Expression<?>>expressions=new ArrayList<Expression<?>>();
expressions.add(orderItemProdJoin.get(Product_.prodId));
expressions.add(criteriaBuilder.sum(root.get(OrderItem_.quantityOrdered)));
criteriaQuery.multiselect(expressions.toArray(new Expression[0]));

criteriaQuery.groupBy(orderItemProdJoin.get(Product_.prodId));
criteriaQuery.having(criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.sum(root.get(OrderItem_.quantityOrdered)), criteriaBuilder.literal(5)));

criteriaQuery.orderBy(criteriaBuilder.desc(criteriaBuilder.sum(root.get(OrderItem_.quantityOrdered))));
List<Object[]> list = entityManager.createQuery(criteriaQuery).getResultList();

此查询汇总 order_item 表中每组产品的数量。

它显示如下所示的行列表。

prod_id       qunatity_ordered

 6            11
 8             8
26             8
 7             7
31             7
12             6
27             6
24             5
 9             5

是否可以仅计算此查询生成的行数 - 在本例中为 9?

我使用的是 EclipseLink 2.5.2 和 Hibernate 4.3.6 Final 提供的 JPA 2.1。

最佳答案

您有两个选择:

SELECT COUNT(*)
  FROM (
   SELECT 1, 
     FROM projectdb.product t0, 
          projectdb.order_item t1 
    WHERE (t0.prod_id = t1.prod_id) /* I prefer not to use Implicit Joins */
 GROUP BY t0.prod_id 
   HAVING (sum(t1.quantity_ordered) >= ?) 
       ) groups

或者:

list.size();

关于mysql - 统计JPA中使用 "group by"和 "having"过滤的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25283986/

相关文章:

java - 运行 Junit 时的 Hibernate ConstraintValidation

java - 在 Hibernate 中使用 javax.management.* api

spring - 内存不足错误: PermGen space - XX:MaxPermSize doesn't work

hibernate - 如何在 Hibernate 中删除没有子实体的父实体?

java - 如何停用 Spring Data 异常转换

mysql - 有密码root失败,无密码root可以

mysql - 在一个 mysql 查询中执行多个选择的更好方法?

php - 从 PHP Web 表单中的选项选择插入外键

php - 使用 PHP 按类别对 MYSQL 结果进行排序

java - JPA 延迟加载和泛型