Динамический построитель критериев JPA - PullRequest
0 голосов
/ 25 октября 2019

Я использую Spring boot JPA, чтобы выполнить нижеприведенный запрос

select DELTA_TYPE,OPERATION_ID,COUNT(*) from ACTIVE_DISCREPANCIES ad group by DELTA_TYPE,OPERATION_ID

DELTA_TYPE, OPERATION_ID и т. Д. Могут поступать из внешней системы, в классе репозитория я пытался выполнить собственный запрос

    @Query(value="select OPERATION_ID,DELTA_TYPE,count(*) from ACTIVE_DISCREPANCIES ad group by ?1",nativeQuery = true)
    public List<Object[]> groupByQuery(@Param("reconType") String recGroupColumns);

, где recGroupColumns = "DELTA_TYPE, OPERATION_ID", но не сработал, так как @param будет разбивать ','

Второй вариант для меня был запрос критерия

public List<Object[]> getReconGroupList() {
        String recGroupColumns = "OPERATION_ID,DELTA_TYPE";
        String[] arrStr = recGroupColumns.split(",");
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Object[]> query = criteriaBuilder.createQuery(Object[].class);
        Root<ActiveDiscrepancies> adr = query.from(ActiveDiscrepancies.class);
        query.groupBy(adr.get("operationId"), adr.get("deltaType"));

    // query.groupBy(adr.get("deltaType"));
    query.multiselect(adr.get("operationId"), adr.get("deltaType"), criteriaBuilder.count(adr));
    TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);
    List<Object[]> resultList = typedQuery.getResultList();
    return resultList;
}

Здесь, как я могу передать groupBy имультиселект динамически?

1 Ответ

0 голосов
/ 29 октября 2019

Используя прогнозы, мы можем решить этот сценарий, ниже приведен код

     Criteria criteria = getSession().createCriteria(ActiveDiscrepancies.class);

      ProjectionList projectionList = Projections.projectionList();

      for(String str : colList) {
        projectionList.add(Projections.groupProperty(str));
      }
        projectionList.add(Projections.rowCount());
        criteria.setProjection(projectionList);
        List results = criteria.list();

        getSession().close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...