当前位置: 首页 > 知识库问答 >
问题:

如何通过查询从Spring数据JPA组返回自定义对象

米俊晤
2023-03-14

我正在用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" }
]

共有1个答案

宗政昱
2023-03-14

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();
}
    null

如上所述,new...语法是一种支持JPA的机制,可与所有JPA提供程序一起使用。但是,如果查询本身不是JPA查询,即它是本机查询,则new...语法将不起作用,因为查询直接传递给基础RDBMS,而基础RDBMS不理解new关键字,因为它不是SQL标准的一部分。

在这种情况下,需要用Spring数据投影接口替换bean类。

步骤1:声明投影接口

package com.path.to;

public interface SurveyAnswerStatistics {
  String getAnswer();

  int getCnt();
}
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();
}

使用SQLas关键字将结果字段映射到投影属性以进行明确的映射。

 类似资料:
  • 问题内容: 我正在使用Spring Data JPA开发Spring Boot应用程序。我正在使用自定义JPQL查询来按某个字段分组并获取计数。以下是我的存储库方法。 它正在工作,结果如下: 我想得到这样的东西: 我该如何实现? 问题答案: 本文向大家介绍如何从Spring Data JPA GROUP BY查询返回自定义对象相关面试题,主要包含被问及如何从Spring Data JPA GROU

  • 我的问题与这条线有关。 下面是我使用group by some Field的存储库方法: 该系统工作正常,结果如下: 我尝试了以下返回类型;但每件事都返回同样的错误。希望有人能帮助我,谢谢你。

  • 在我的数据库中,我有一个具有以下属性的表“CITA”:id,fecha\u hora,description,id\u empleado,id\u cliente。 我还有一个Spring JPA存储库: 我需要这个查询: 我的问题是我不知道我应该把它放在哪里来还给我像地图这样的东西 因为它不起作用: 编辑 如果我试图从我的REST控制器调用estadistic as(),我有一个错误。 这是我的

  • 我试图从spring数据jpa-native查询返回自定义对象 以下是我到目前为止根据这个如何从Spring Data JPA GROUP BY查询返回自定义对象所做的工作 我应该能够创建如下查询: 我声明投影接口 那就叫它吧 不过我有个例外 javax。坚持不懈PersistenceException:org。冬眠MappingException:未知实体:javax。坚持不懈元组 知道我做错了

  • 我有一个带有嵌入Id的类。当我尝试使用Jpa存储库进行搜索时,它只返回一个空对象。问题似乎出在嵌入式Id中,因为我用一个没有这个Id的类进行了测试,结果很好。 当我针对数据库进行测试时,JPA在控制台中输出的查询工作正常。 并且没有输出错误。 编辑:数据库中有数据 EDIT2:添加了equals和hashcode。 编辑3:findAll方法有效。 实体 嵌入ID 存储库 服务 正如你所看到的,我