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

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

Repository:

@Repository
public interface TestCostRepository extends JpaRepository<TestCost, Integer>, JpaSpecificationExecutor<TestCost> {
}

TestCostService:

public interface TestCostService {
    List<Map<String,String>> dynamicGroupBy(List<String> groupByParams,String sumParam);
}

TestCostServiceImpl:

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

}

相关推荐

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

    2024-03-22 09:34:02       21 阅读
  2. JPA + ES 动态条件查询

    2024-03-22 09:34:02       30 阅读
  3. JPA构建多条件查询

    2024-03-22 09:34:02       38 阅读
  4. JPA查询PostgreSQL行排序问题

    2024-03-22 09:34:02       34 阅读
  5. 使用Spring Boot和JPA实现多数据源的方法

    2024-03-22 09:34:02       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 09:34:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 09:34:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 09:34:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 09:34:02       20 阅读

热门阅读

  1. 浅谈业务逻辑漏洞

    2024-03-22 09:34:02       18 阅读
  2. Devin 40: 人工智能与未来的融合

    2024-03-22 09:34:02       17 阅读
  3. 构建Pytorch虚拟环境教程

    2024-03-22 09:34:02       20 阅读
  4. ROS git使用

    2024-03-22 09:34:02       17 阅读
  5. RHCE 第二章 时间服务器

    2024-03-22 09:34:02       20 阅读
  6. docker基础(五)之docker run(第二弹)

    2024-03-22 09:34:02       19 阅读
  7. P1005 [NOIP2007 提高组] 矩阵取数游戏

    2024-03-22 09:34:02       16 阅读
  8. Ubuntu---之用户管理

    2024-03-22 09:34:02       18 阅读