我正在使用 Spring Data JPA 开发一个 Spring Boot 应用程序。我正在使用自定义 JPQL 查询按某个字段分组并获取计数。以下是我的存储库方法。
@Query(value = "select count(v) as cnt, v.answer from Survey v group by v.answer")
public List<?> findSurveyCount();
它正在工作,结果如下:
[
[1, "a1"],
[2, "a2"]
]
我想得到这样的东西:
[
{ "cnt":1, "answer":"a1" },
{ "cnt":2, "answer":"a2" }
]
我怎样才能做到这一点?
原文由 Pranav C Balan 发布,翻译遵循 CC BY-SA 4.0 许可协议
JPQL 查询的解决方案
JPA 规范 中的 JPQL 查询支持此功能。
重要笔记
MyBean
并且它在包com.path.to
中,则 bean 的完全限定路径将是com.path.to.MyBean
简单地提供MyBean
将不起作用(除非 bean 类在默认包中)。new
关键字调用 bean 类构造函数。SELECT new com.path.to.MyBean(...)
会起作用,而SELECT com.path.to.MyBean(...)
不会。@Query("SELECT ...")
或@Query(value = "SELECT ...")
或@Query(value = "SELECT ...", nativeQuery = false)
将工作,而@Query(value = "SELECT ...", nativeQuery = true)
将不起作用。这是因为本机查询无需修改即可传递给 JPA 提供程序,并且是针对底层 RDBMS 执行的。由于new
和com.path.to.MyBean
不是有效的 SQL 关键字,因此 RDBMS 会引发异常。原生查询解决方案
如上所述,
new ...
语法是 JPA 支持的机制,适用于所有 JPA 提供程序。但是,如果查询本身不是 JPA 查询,即它是本机查询,则new ...
语法将不起作用,因为查询直接传递给底层 RDBMS,它不理解new
关键字,因为它不是 SQL 标准的一部分。在这种情况下,需要用 Spring Data Projection 接口替换 bean 类。
使用 SQL
AS
关键字将结果字段映射到投影属性以进行明确映射。