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

}
相关推荐
RealPluto16 分钟前
Spring AOP 失效排查
java·spring
码路飞41 分钟前
热榜全是 OpenClaw,但我用 50 行 Python 就造了个桌面 AI Agent 🤖
java·javascript
Nyarlathotep01131 小时前
LinkedList源码分析
java·后端
用户8307196840821 小时前
Java 告别繁琐数据统计代码!MySQL 8 窗口函数真香
java·sql·mysql
带刺的坐椅2 小时前
SolonCode v0.0.20 发布 - 编程智能体(新增子代理和浏览器能力)
java·ai·agent·solon·solon-ai·claude-code·openclaw
stark张宇3 小时前
MySQL 核心内幕:从索引原理、字段选型到日志机制与外键约束,一篇打通数据库任督二脉
数据库·mysql·架构
会员源码网3 小时前
数字格式化陷阱:如何优雅处理 NumberFormatException
java
孔明click333 小时前
Sa-Token v1.45.0 发布 🚀,正式支持 Spring Boot 4、新增 Jackson3/Snack4 插件适配
java·sa-token·开源·springboot·登录·权限认证
程序猿阿越4 小时前
Kafka4源码(二)创建Topic
java·后端·源码阅读
悟空码字4 小时前
Spring Boot 整合 MongoDB 最佳实践:CRUD、分页、事务、索引全覆盖
java·spring boot·后端