如何更改 Hibernate HQL 查询输出的格式

How to change the formatting of the output of Hibernate HQL query

我正在使用 Spring Data JPA 开发 Spring 引导应用程序。我正在使用自定义 JPQL 查询按某些字段进行分组并获取计数。以下是我的存储方法。

@Query("SELECT v.status.name, count(v) as cnt FROM Pet v GROUP BY v.status.name")
List<Object[]> countByStatus();

运行正常,得到的结果如下:

[
    [
        "pending",
        1
    ],
    [
        "available",
        4
    ]
]

但是,我希望我的 Rest 端点响应格式如下的输出

{
    "pending": 1,
    "available": 4
}

我怎样才能做到这一点?

基本上您想要生成一个 JSON,其中其属性(“待处理”、“可用”)是动态的并且来自查询的 SELECT v.status.name 部分。

创建一个 DTO 来保存行值:

package com.example.demo;

public class ResultDTO {

    private final String key;
    private final Long value;

    public ResultDTO(String key, Long value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public Long getValue() {
        return value;
    }
}

更改查询以每行创建一个新的 ResultDTO:

@Query("SELECT new com.example.demo.ResultDTO(v.status.name, count(v)) as cnt FROM Pet v GROUP BY v.status.name")
List<ResultDTO> countByStatus();
  • “com.example.demo”是我的包裹,你应该换成你的。

然后从您的服务 class 或您的控制器,您必须将 List<ResultDTO> 转换为 Map<String, Long> 保存所有行的键和值。

final List<ResultDTO> repositoryResults = yourRepository.countByStatus();
final Map<String, Long> results = repositoryResults.stream().collect(Collectors.toMap(ResultDTO::getKey, ResultDTO::getValue));

您的控制器应该能够将 final Map<String, Long> results 转换为所需的 JSON