首页 > 解决方案 > 在 Spring Native Query 项目中获取 Null 值

问题描述

这是我的数据存储库文件,我使用本机查询来检索数据的所有数据地址(位置)。我使用 Postman 调用了该函数,我得到了空的位置输出。这是我第一次使用 Native 查询,它真的不可能解决这些错误

资料库

public interface DataRepository extends JpaRepository<Data, Long> {

    @Query(value = "SELECT dataAddress FROM Data")
    List<DataProject> getDataAddress();
}

数据服务实现

    public List<DataProject> getDataAddress() {
        return dataRepository.getDataAddress();
    }

数据服务

List<DataProject> getDataAddress();

数据模型

@Entity
@Table(name = "CCCData")
public class Data {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long dataId;

    @Column(name = "DATA_NAME")
    private String dataName;

    @Column(name ="DATA_ADDRESS")
    private String dataAddress;

    @Column(name = "DATA_DESC")
    private String dataDesc;

    @CreationTimestamp
    private Date dateOfCreated;

    @CreationTimestamp
    private Date dateOfUpdated;

    public long getDataId() {
        return dataId;
    }

    public void setDataId(long dataId) {
        this.dataId = dataId;
    }

    public String getDataName() {
        return dataName;
    }

    public void setDataName(String dataName) {
        this.dataName = dataName;
    }

    public String getDataAddress() {
        return dataAddress;
    }

    public void setDataAddress(String dataAddress) {
        this.dataAddress = dataAddress;
    }

    public String getDataDesc() {
        return dataDesc;
    }

    public void setDataDesc(String dataDesc) {
        this.dataDesc = dataDesc;
    }

    public Date getDateOfCreated() {
        return dateOfCreated;
    }

    public void setDateOfCreated(Date dateOfCreated) {
        this.dateOfCreated = dateOfCreated;
    }

    public Date getDateOfUpdated() {
        return dateOfUpdated;
    }

    public void setDateOfUpdated(Date dateOfUpdated) {
        this.dateOfUpdated = dateOfUpdated;
    }

数据投影

public interface DataProject {

    String getDataAddress();
}

数据控制器

@GetMapping("/data/locations")
    public List<DataProject> getDataAddress() {
        return dataService.getDataAddress();
    }

邮递员输出

[
    {
        "dataAddress": null
    },
    {
        "dataAddress": null
    },
    {
        "dataAddress": null
    },
    {
        "dataAddress": null
    }
]

标签: spring-bootpostmannativequery

解决方案


Spring 不会使用以下查询返回您唯一的地址。它仍然返回你DATA的对象

public interface DataRepository extends JpaRepository<Data, Long> {

    @Query(value = "SELECT dataAddress FROM Data")
    List<DataProject> getDataAddress();
}

仅用于获取DataAddress您需要在Data模型内部创建一个构造函数DataAddress

public Data(String dataAddress) {
    this.dataAddress = dataAddress;
}

您的查询将如下所示:

public interface DataRepository extends JpaRepository<Data, Long> {

    @Query(value = "SELECT new Data(dataAddress) FROM Data")
    List<DataProject> getDataAddress();
}

更新 1:

如果您需要对具有相同数据类型的其他字段进行此操作,然后上面的基于“构造函数”的方法将失败。还有一些其他的选择:

您可以获取DATA对象并使用 java 流映射函数仅提取 1 个字段。data.stream().map((data) -> data.getDataAddress()).collect(Collectors.toList())

您可以使用本机 SQL 查询仅获取必填字段。
@Query(value = "SELECT d.data_address FROM CCCData d", nativeQuery=true)


推荐阅读