如何使用JPA使用AVG和GROUP创建条件查询

问题描述

我想使用Criteria查询基于平均客户评价获取产品列表。我使用条件查询聚合函数AVG编写了一段代码,并保留了GROUP BY子句。但是以某种方式,我遇到了“不是表达式分组” 异常。我试图在Google中搜索以解决,但没有任何帮助。在下面发布代码

CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Object[]> cq = builder.createQuery(Object[].class);
        Root<GdbCustomerProductReviewImpl> productReview = cq.from(GdbCustomerProductReviewImpl.class);
        Path productPath = productReview.get("product");
        Path documentPath = productPath.get("photo");
        Path categoryPath = productPath.get("defaultCategory");
        Path productCategoryPath = categoryPath.get("prdCategory");
        cq.multiselect(productReview.get("id"),productPath.get("url"),productPath.get("skuName"),documentPath.get("id"));
        cq.where(builder.isNotNull(productPath.get("id")));
        cq.where(builder.equal(productReview.get("status"),"ACTIVE"));
        cq.where(builder.equal(productReview.get("reviewType"),"PRODUCT"));
        cq.where(builder.equal(productPath.get("isEnable"),Boolean.TRUE));
        cq.where(builder.equal(productPath.get("status"),StatusType.APPROVED.getType()));
        cq.where(builder.isNotNull(productPath.get("defSkuMap")));
        cq.where(builder.equal(productCategoryPath.get("isEnabled"),Boolean.TRUE));
        cq.groupBy(productReview.get("id"));
        Expression event_count = builder.avg(productReview.get("rating"));
        cq.orderBy(builder.desc(event_count));
        List<Object[]> resultList = em.createQuery(cq).setMaxResults(size).getResultList();

解决方法

进一步研究发现了一个解决方案,这也要归功于crizzis。发布对我有用的解决方案。

CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Object[]> cq = builder.createQuery(Object[].class);
        Root<GdbCustomerProductReviewImpl> productReview = cq.from(GdbCustomerProductReviewImpl.class);
        Path productPath = productReview.get("product");
        Path documentPath = productPath.get("photo");
        Path categoryPath = productPath.get("defaultCategory");
        Path productCategoryPath = categoryPath.get("prdCategory");
        Expression event_count = builder.avg(productReview.get("rating"));
        cq.multiselect(productPath.get("id"),productPath.get("url"),productPath.get("skuName"),documentPath.get("id"));
        cq.where(builder.isNotNull(productPath.get("id")),builder.equal(productReview.get("status"),"ACTIVE"),builder.equal(productReview.get("reviewType"),"PRODUCT"),builder.equal(productPath.get("isEnable"),Boolean.TRUE),builder.equal(productPath.get("status"),StatusType.APPROVED.getType()),builder.isNotNull(productPath.get("defSkuMap")),builder.equal(productCategoryPath.get("isEnabled"),Boolean.TRUE));
        cq.groupBy(productPath.get("id"),documentPath.get("id"));
       
        cq.orderBy(builder.desc(event_count));
        List<Object[]> resultList = em.createQuery(cq).setMaxResults(size).getResultList();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...