如何更改 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
我正在使用 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