繁体   English   中英

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

[英]Getting only values instead of keys and values in JSON response in spring boot

我正在尝试使用 SQL 查询从 Repository 检索数据,但是当我尝试检索它时,我在 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 ] ] }

知道我哪里出错了吗?

是的,您正在使用本机查询,并且您试图通过将查询结果与您的对象进行映射来将结果存储在对象中。 不幸的是,它不能那样工作。

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

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

另一种简单的方法是使用Projection interface

首先在您的查询中更改此行:

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 数据,然后不想在代码中修改它,则此方法将起作用。

在你的情况下,我会创建一个 TaskDto 类:

package your.package.dto;
@Data
@AllArgsConstructor
public class TaskDto implements Serializable { 
    // all fields 
}

比,我会使用如下查询

SELECT new your.package.dto.TaskDto (sys.id, sys.name, sys.eventtype, workflow_agg.subprocess_id)
FROM ...

注意:

  1. 在查询内部不用as ;
  2. 查询不能由native

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM