我正在尝试使用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
是的,您使用的是本机查询,并且您正在尝试通过将查询结果与对象映射来将结果存储在对象中。不幸的是,它不能那样工作。
如果尝试在对象中使用本机查询的结果,则只会获取值,而不是键和值。要同时获取键和值,您有两个选择:
一种方法是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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。