Java JPA-按录取表格状态计数(状态类型枚举)

Java JPA-按录取表格状态计数(状态类型枚举),java,spring-boot,jpa,enums,spring-data-jpa,Java,Spring Boot,Jpa,Enums,Spring Data Jpa,我声明了一个Enum类型StatusEnum,如下所示: public enum StatusEnum { PENDING, ACCEPTED, REJECTED, IN_PROGRESS, COMPLETED } 我正试图从他们的状态中获取录取表格的数量,所以我尝试了查询(在存储库中): 资源类别: @GetMapping("/workorders/countByStatus") @Timed public List<AdmissionFormStatusCountResponseDT

我声明了一个
Enum
类型StatusEnum,如下所示:

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

我正试图从他们的状态中获取录取表格的数量,所以我尝试了查询(在存储库中):

资源类别:

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

只有当状态值存在时,它才会使用count进行响应,但对于尚未分配给任何准入表单的Enum状态,我还要求结果中的count=0

在准备您的
admissionFormStatusCountList
后,手动查看其中缺少哪些枚举,并将其添加为值0。您无法将其从数据库中取出。

我按照以下要求进行了更改

我将
admissionFormStatusCountResponsed定义为如下内容:

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
中定义响应中的所有静态,则Robert Niestroj是正确的。只是编辑帮助我的代码

您需要一个包含所有可能状态值的表,以便能够从数据库中获取这些值。
@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
}