我正在使用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" }
]
我该如何实现?
JPQL查询解决方案
JPA规范中的 JPQL查询支持此功能。
步骤1:声明一个简单的bean类
package com.path.to;
public class SurveyAnswerStatistics {
private String answer;
private Long cnt;
public SurveyAnswerStatistics(String answer, Long cnt) {
this.answer = answer;
this.count = cnt;
}
}
步骤2:从存储库方法返回bean实例
public interface SurveyRepository extends CrudRepository<Survey, Long> {
@Query("SELECT " +
" new com.path.to.SurveyAnswerStatistics(v.answer, COUNT(v)) " +
"FROM " +
" Survey v " +
"GROUP BY " +
" v.answer")
List<SurveyAnswerStatistics> findSurveyCount();
}
重要笔记
com.path.to
,则指向bean的标准路径将为com.path.to.MyBean
。仅提供MyBean将不起作用(除非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,该RDBMS不理解该new
关键字,因为它不是该关键字的一部分。 SQL标准。
在这种情况下,需要用Spring Data Projection
接口替换bean类。
步骤1:声明投影界面
package com.path.to;
public interface SurveyAnswerStatistics {
String getAnswer();
int getCnt();
}
步骤2:从查询中返回投影的属性
public interface SurveyRepository extends CrudRepository<Survey, Long> {
@Query(nativeQuery = true, value =
"SELECT " +
" v.answer AS answer, COUNT(v) AS cnt " +
"FROM " +
" Survey v " +
"GROUP BY " +
" v.answer")
List<SurveyAnswerStatistics> findSurveyCount();
}
使用SQL AS关键字将结果字段映射到投影属性,以进行明确的映射。
我正在用Spring Data JPA开发一个Spring Boot应用程序。我正在使用一个自定义的JPQL查询按某个字段分组并获得计数。下面是我的存储库方法。 实际运行结果如下:
下面是存储库类
为了计算添加到DB表名称中的项数,我使用了一个带有Spring JPA的本机查询: DTO对象,应该包含在返回的列表中: 我似乎没有正确定义dto?如何正确定义dto,以便返回对象列表?
我正在尝试使用状态代码201的Ihttpstatus标头获取此JSON响应,并将IHttpActionResult作为我的方法返回类型。 我想要返回的JSON: {“客户 ID”: 324} 我的方法: JSON返回: “ID”:324,“日期”:“2014-06-18T17:35:07.8095813-07:00”, 以下是我尝试过的一些返回,它们要么给了我uri null错误,要么给了我类似于
我正在尝试扩展使用
我正在应用程序中使用Hazelcast作为共享映射。我的地图是这样的: 第144行: 这里是我的类: 很酷,在重新编译Hazelcast之后,使用这个新的jar,我可以使用普通SQL访问查询。但对于pagingQueries,我有一些错误。