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

}
相关推荐
Grey Zeng6 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白7 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
AAA修煤气灶刘哥8 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
程序新视界9 小时前
学习MySQL绕不开的两个基础概念:聚集索引与非聚集索引
mysql
架构师沉默11 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
RestCloud12 小时前
跨境数据传输:ETL如何处理时区与日期格式差异
mysql·api
Java中文社群12 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL13 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301414 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥14 小时前
原来公平锁和非公平锁差别这么大
java