JPA使用CriteriaQuery实现动态分组查询

JPA中实现动态分组查询,即输入几个筛选参数就按照几个参数进行分组查询,但是不知道输入的是几个参数,要实现动态的分组查询,用CriteriaQuery实现。

Repository:

java 复制代码
@Repository
public interface TestCostRepository extends JpaRepository<TestCost, Integer>, JpaSpecificationExecutor<TestCost> {
}

TestCostService:

java 复制代码
public interface TestCostService {
    List<Map<String,String>> dynamicGroupBy(List<String> groupByParams,String sumParam);
}

TestCostServiceImpl:

java 复制代码
@Service
public class TestCostServiceImpl implements TestCostService {

    @Autowired
    TestCostRepository repository;

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Override
    public List<Map<String, String>> dynamicGroupBy(List<String> groupByParams, String sumParam) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
        Root<TestCost> root = query.from(TestCost.class);

        List<Expression<?>> expressions = new ArrayList<>();
        for (String field : groupByParams) {
            expressions.add(root.get(field));
        }
        query.groupBy(expressions.toArray(new Expression[0]));

        Expression<BigDecimal> sumExpression = cb.sum(root.get(sumParam));
        expressions.add(sumExpression);
        query.multiselect(expressions.toArray(new Expression[0]));

        TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);
        List<Object[]> resultList = typedQuery.getResultList();

        List<Map<String, String>> returnList = new ArrayList<>();
        for (Object[] result : resultList) {
            Map<String, String> returnMap = new LinkedHashMap<>();
            returnMap.put("name", (String) result[0]);
            returnMap.put("gender", (String) result[1]);
            returnMap.put("cost", result[2].toString());
            returnList.add(returnMap);
        }

        return returnList;
    }

}
相关推荐
bbq粉刷匠10 分钟前
MySQL 聚合函数&分组&联合查询
数据库·mysql
毕设源码-朱学姐31 分钟前
【开题答辩全过程】以 基于springboot的日用药品仓库管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
毕设源码-赖学姐44 分钟前
【开题答辩全过程】以 基于javaweb的外卖点餐系统的设计与实现为例,包含答辩的问题和答案
java
沛沛老爹1 小时前
从Web到AI:行业专属Agent Skills生态系统技术演进实战
java·开发语言·前端·vue.js·人工智能·rag·企业转型
霖霖总总1 小时前
[小技巧43]MySQL MVCC 深度解析:快照读 vs 当前读
数据库·mysql
程农1 小时前
基于Java的报名系统
java·开发语言
Jackson@ML2 小时前
2026最新版Sublime Text 4安装使用指南
java·python·编辑器·sublime text
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 校园闲置物品交易平台的设计与实现为例,包含答辩的问题和答案
java·eclipse
chilavert3182 小时前
技术演进中的开发沉思-326 JVM:内存区域与溢出异常(上)
java·jvm
纪莫3 小时前
技术面:如何让你的系统抗住高并发的流量?
java·redis·java面试⑧股