开发者社区> 问答> 正文

在Spring Boot中仅获取值而不是JSON响应中的键和值

我正在尝试使用SQL查询从存储库中检索数据,但是在尝试检索它时,我只会得到值,而不是JSON响应中的键和值。

我有以下课程

资料库

@Repository
public interface ReportingDataRepository extends CrudRepository<Task, String> {
  @Query(name = "task.getReportingData")
  List<Task> getReportingData(String startDate, String endDate);
}```
控制者

@RequestMapping(path = "/api/{startdate}/{enddate}") public TaskScores getScoresDataByDate(@PathVariable("startdate") String startDate, @PathVariable("enddate") String endDate) { return new TaskScores((reportingDataRepository.getReportingData(startDate, endDate)));

}``` 控制器中的包装器类

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Data
public class TaskScores {
  List<Task> tasks;
}```
实体

@Getter @Setter @ToString @AllArgsConstructor @NoArgsConstructor @Entity @Data

@NamedNativeQuery( name = "task.getReportingData", query = "SELECT sys.id as id, sys.name as sys, sys.eventtype, workflow_agg.subprocess_id " + "FROM daily_agg_counts_system_score as sys_agg " + "join system_eventtype as sys on sys_agg.system_id = sys.id " + "join system_subprocess_mapping sm on sys_agg.system_id = sm.system_id " + "join daily_agg_workflow_completion_score workflow_agg on sm.subprocess_id = workflow_agg.subprocess_id " + "join sub_process sp on sp.id = sm.subprocess_id " + "join process as p on p.id = sys.process_id " + "join flow on flow.id = p.flow_id " + "join program on program.id = flow.program_id " + "where sys_agg.datepst BETWEEN ?1 AND ?2 " + "order by program.id asc, p.flow_id asc, sp.id asc, sys_agg.system_id asc, sys_agg.datepst asc " + "limit 1" )

public class Task implements Serializable{
  @Column(name = "id")
  @Id
  private String id;

  @Column(name = "system")
  private String sys;

  @Column(name = "event_type")
  private String eventType;

  @ManyToOne(fetch = FetchType.LAZY)
  private SubProcess subprocessId;

  @Embeddable
  class Score implements Serializable {
  @JsonIgnore
  String score;
}

}``` 我正在使用Spring Data JPA。当我运行此代码时,我将获得以下JSON

{
  "tasks": [
    [
      1,
      "oms",
      "BE",
      1
    ]
  ]
}```

但我希望它像实际的json 

{ "tasks": [ [ "id" : 1, "sys" : "oms", "eventType" : "BE", "subprocessId" : 1 ] ] }```

知道我要去哪里错了吗?

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 17:37:19 600 0
1 条回答
写回答
取消 提交回答
  • 是的,您使用的是本机查询,并且您正在尝试通过将查询结果与对象映射来将结果存储在对象中。不幸的是,它不能那样工作。

    如果尝试在对象中使用本机查询的结果,则只会获取值,而不是键和值。要同时获取键和值,您有两个选择:

    一种方法是SQLResultsetMapping。请参阅SQLResultsetMapping以了解更多信息。

    另一种简单的方法是使用Projection接口。

    首先在查询中更改此行:

    SELECT sys.id as id, sys.name as sys, sys.eventtype, workflow_agg.subprocess_id
    至
    
    SELECT sys.id as id, sys.name as sys, sys.eventtype as eventtype, workflow_agg.subprocess_id as subprocessid
    

    即给您检索到的所有列取别名。

    然后您创建一个像这样的接口(这称为投影接口):

    interface getSysProperties{
        getid();
        getsys();
        geteventtype();
        getsubprocessid();
    }
    

    然后,不要在对象中检索SQL结果,而是在接口投影中检索它,例如:

      @Query(name = "task.getReportingData")
      List<getSysProperties> getReportingData(String startDate, String endDate);
            // ^Projection interface instead of Entity
    

    如果您只想检索SQL数据,然后又不想在代码中对其进行修改,则此方法将起作用。

    回答来源:Stack Overflow

    2020-03-27 17:40:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多