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;
    }

}
相关推荐
Random Glow3 分钟前
聚簇索引:为什么主键顺序决定插入性能
数据库·mysql·性能优化·innodb·索引
软件技术NINI4 分钟前
基于PHP和MySQL的快递代收点管理系统的设计与实现
开发语言·javascript·数据库·mysql·毕业设计·php·毕设
酣大智10 分钟前
hibernate学习笔记
java·hibernate·session
SelectDB技术团队14 分钟前
ClickHouse SQL 好学吗?从 MySQL 迁移 Doris 的完整兼容验证
人工智能·sql·mysql·clickhouse·开源·apache doris·增量计算
吹什么轩28 分钟前
MySQL 增删改查(CRUD)完全指南:从 INSERT 到 GROUP BY
数据库·mysql
为思念酝酿的痛43 分钟前
MySQL表的约束
数据库·mysql
时间售卖铺1 小时前
MySQL存储过程流程控制全解析
运维·数据库·mysql·云原生
careathers1 小时前
【数据结构】基于比较的排序算法 - 插入排序
java·数据结构·排序算法
街头便衣1 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
mister_guo1 小时前
Spring Boot 配置文件读取的几种方式:用法、原理与常见误区
java·spring boot