【问题标题】:Mapping query results into object for REST API将查询结果映射到 REST API 的对象
【发布时间】:2020-04-16 14:53:06
【问题描述】:

我是 Spring Framework 的新手,在从我的应用程序中检索本机查询结果时遇到了麻烦。该应用程序应该从我的 PostgreSQL 数据库中检索一些特定数据并将其公开为 REST 资源。但是,似乎无法将查询结果映射到我定义的实体对象中。该对象的定义方式与创建数据库的方式相同:我还在我的记录器应用程序上使用相同的实体进行插入操作。

我创建了一个 Entity 类:

package com.umeter.rest;

import ...

@Entity
@Table(name="dati_impianti")
public class DatiImpiantoEntity {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id_lettura;

    @Column(name="sigla_impianto")
    private String sigla_impianto;
    @Column(name="timestamp")
    private Date timestamp;
    @Column(name="lettura")
    private Float lettura;
    @Column(name="stato")
    private Integer stato;

    public Integer getId_lettura() {
        return id_lettura;
    }

    public void setId_lettura(Integer id_lettura) {
        this.id_lettura = id_lettura;
    }

    public String getSigla_impianto() {
        return sigla_impianto;
    }

//other Getters and Setters

一个 Repository 类(带有一个随机的 nativequery 只是为了尝试一下)。

编辑:是的,需要使用本机查询,因为我将使用来自 postgresql 的一些本机功能,这些功能无法通过可用的普通 CRUD 方法获得。但是,这似乎不是问题,因为我尝试使用“findAll()”方法只是为了获得完全相同的 [null] 输出

package com.umeter.rest;

import ...

@Repository
public interface DatiRepository extends CrudRepository<DatiImpiantoEntity, Integer> {

    @Query(nativeQuery = true, value = "SELECT * from dati_impianti LIMIT 10")
    public List<DatiImpiantoEntity> getIstantanea();
}

还有一个REST 控制器

package com.umeter.rest;

import ...

@RestController
@RequestMapping(path="/api")
public class DatiRestController {

    @Autowired
    private DatiRepository datiRepository;


    @GetMapping(path="/istantanea")
        public @ResponseBody List<DatiImpiantoEntity> getIstantanea() {
            return datiRepository.getIstantanea();
    }
}

但是,我得到的结果是一个空值列表(我想 Spring 无法将查询结果映射到我的 Entity 对象中):

[null,null,null,null,null,null,null,null,null,null]

当我使用通用“对象”返回类型(不包括数据库连接或查询问题)设置方法时,我得到了一个输出。但是,我得到的不是正确的 Json 输出格式,我知道现在应该是这样的:

[["MF1","2019-10-11T10:24:23.917+0000",3.814,6,null],["MF1","2019-10-11T10:24:33.867+0000",3.814,6,null],["MF1","2019-10-11T10:24:43.920+0000",3.814,6,null],["MF1","2019-10-11T10:24:53.884+0000",3.814,6,null],["MF1","2019-10-11T10:25:03.864+0000",3.814,6,null],["MF1","2019-10-11T10:25:13.869+0000",3.814,6,null],["MF1","2019-10-11T10:25:23.872+0000",3.814,6,null],["MF1","2019-11-08T13:17:35.175+0000",5511.1,0,null],["MF2","2019-11-08T13:17:35.174+0000",6567.025,0,null],["MF1","2019-11-08T13:25:25.655+0000",5548.027,0,null]]

为了完整起见,我附上一张数据库数据结构的图片(id 似乎没有真正使用,但 Spring 需要它用于插入过程):

【问题讨论】:

  • 您是否配置了 JSON 对象映射器?喜欢here
  • @HariharDas 我没有彻底尝试过(并且它不包含在我当前的资源中),但考虑到它在没有 Spring 文档示例的情况下工作,这似乎不是问题。我可以再试一次,但是当我这样做时,我只得到了相同的“空”输出,但用 {} 括号代替
  • 能否请您重写DatiImpiantoEntitytoString 方法?例如从覆盖的 toString 方法中返回 timestamp 字段。
  • 我在之前的测试中这样做过,但没有结果。如果我错了也请纠正我,但我想我们想要的不是“类”的字符串表示,而是更像是到对象的映射(其中 json 输出将由来自所有字段的 toString 方法而不是从类本身)
  • 抱歉,我想看看是不是登录控制台有问题。但似乎您将控制器方法的输出添加到问题中。这确实是一个空值列表。

标签: java spring rest spring-mvc spring-data-jpa


【解决方案1】:

数据库表 dati_impianti 的所有记录都具有空 id 值。这不适用于CrudRepositoryid 字段在所有记录中必须具有唯一值。

【讨论】:

  • 不错的答案
  • 您好,谢谢!你已经试过了吗?我回家看看是不是这个原因
  • 是的,我已经尝试过与您的类似的表和存储库。我得到了类似的结果。但是通过唯一的 id 值,我得到了预期的结果。
  • 谢谢@HariharDas,我确认这是问题
【解决方案2】:

您可以直接使用实体对象而不是使用原生查询

 @Query(nativeQuery = true, value = "SELECT * from dati_impianti LIMIT 10")
    public List<DatiImpiantoEntity> getIstantanea();

将其替换为

@Query("SELECT * from DatiImpiantoEntity LIMIT 10")
    public List<DatiImpiantoEntity> getIstantanea();

【讨论】:

  • 很抱歉,但这似乎不起作用(由于查询验证,它会出现编译时错误)
  • 好的,然后尝试像SELECT d from DatiImpiantoEntity d LIMIT 10 这样更改查询,我的意思是使用别名。可以参考here
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
相关资源
最近更新 更多