JPA - подсчет по статусу формы приема (тип статуса Enum) - PullRequest
0 голосов
/ 23 ноября 2018

Я объявил Enum тип StatusEnum как:

public enum StatusEnum {
PENDING, ACCEPTED, REJECTED, IN_PROGRESS, COMPLETED

}

Я пытаюсь получить счет формы приема от их статуса, поэтому я попытался с запросом (в репозитории):

@Query("SELECT COUNT(a.status), a.status FROM AdmissionForms a GROUP BY a.status ORDER BY a.status ASC")
List<Object[]> admissionFormCountByStatus();

затем я проанализировал его в списке DTO, который я указал (в классе обслуживания),

List<Object[]> objects = admissionFormRepository.admissionFormCountByStatus();
    for (Object[] singleObject : objects ) {
        admissionFormStatusCountList.add(new AdmissionFormStatusCountResponseDTO(
            ((Number)singleObject[0]).intValue(), (StatusEnum)singleObject[1]));
    }

мой DTO (AdmissionFormStatusCountResponseDTO) как:

public class AdmissionFormStatusCountResponseDTO {
private int count;
private StatusEnum status;

public AdmissionFormStatusCountResponseDTO(int count, StatusEnum status) {
    this.count = count;
    this.status = status;
  }
}

класс ресурсов:

@GetMapping("/workorders/countByStatus")
@Timed
public List<AdmissionFormStatusCountResponseDTO> admissionFormCountByStatus() {
    return admissionFormService.workorderCountByStatus();
}

результаты, которые я получаю, выглядят так:

[
  {
    "count": 6,
    "status": "ACCEPTED"
  },
  {
    "count": 2,
    "status": "COMPLETED"
  },
  {
    "count": 3,
    "status": "IN_PROGRESS"
  }
]

Он отвечает счетчиком, только если присутствует это значение состояния, но я такжеТребуется счет = 0 в результате для статуса из Enum еще не назначен ни одной форме приема.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я сделал следующие изменения, которые мне потребовались.

Я определил admissionFormStatusCountResponseDTO как:

public class AdmissionFormStatusCountResponseDTO {

private Long accepted;
private Long completed;
private Long inProgress;
private Long pending;
private Long rejected;

public AdmissionFormStatusCountResponseDTO() {
}

public AdmissionFormStatusCountResponseDTO(Long accepted, Long completed, Long inProgress, Long pending, Long rejected) {
    this.accepted = accepted;
    this.completed = completed;
    this.inProgress = inProgress;
    this.pending = pending;
    this.rejected = rejected;
  }
//getters and setters
}

, затем обновил запрос к хранилищу, используя этот DTO как:

@Query("select new com.purvik.app1.service.dto.AdmissionFormStatusCountResponseDTO(" +
    "SUM(CASE WHEN a.status='ACCEPTED' then 1 else 0 END)," +
    "SUM(CASE WHEN a.status='COMPLETED' then 1 else 0 END)," +
    "SUM(CASE WHEN a.status='IN_PROGRESS' then 1 else 0 END)," +
    "SUM(CASE WHEN a.status='PENDING' then 1 else 0 END)," +
    "SUM(CASE WHEN a.status='REJECTED' then 1 else 0 END)" +
    ") from AdmissionForm a")
AdmissionFormStatusCountResponseDTO admissionFormCountByStatusNew();

Класс обслуживания:

public AdmissionFormStatusCountResponseDTO admissionFormCountByStatus(){
    log.debug("Request to get count of AdmissionForm by it's Status ");
    return admissionFormRepository.admissionFormCountByStatusNew();
}

Конечная точка ресурса:

@GetMapping("/admissionForms/countByStatus")
@Timed
public AdmissionFormStatusCountResponseDTO admissionFormCountByStatus() {
    log.debug("get count of status from stored admissionForm");
    return admissionFormService.admissionFormCountByStatus();
}

ответ, который теперь имеет:

{
"accepted": 5,
"completed": 0,
"inProgress": 4,
"pending": 1,
"rejected": 1
}

Мне не нужно иметьвся статика определена в Enum.Это JPQL-запрос на основе конструктора, который дает ожидаемые результаты.Надеюсь, что это поможет другим.

@ Роберт Нистрой прав, если вы хотите, чтобы в ответе была указана вся статика в Enum.Просто редактирую мой код, который мне помогает.

0 голосов
/ 23 ноября 2018

После подготовки вашего admissionFormStatusCountList посмотрите вручную, какие перечисления там отсутствуют, и добавьте их со значением 0. Вы не собираетесь получать его из БД.

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