【问题标题】:how to return customized json as output in Springboot JPA?如何在 Spring Boot JPA 中返回自定义 json 作为输出?
【发布时间】:2018-10-16 08:15:06
【问题描述】:

我有两个实体负责从两个不同的表中获取数据,并且我创建了一个类来显示这两个实体的组合结果。我能够使用 JPA 获取数据,但输出不是所需的 JSON 格式。

第一个实体,

@Entity
@Table(name="basicinfo")
public class Rfx_BasicInfo implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    private String uniqueid;

    private String description;
    private String uniqueidstatus;
    private LocalDateTime startdate;
    private LocalDateTime enddate;
    private String createdby;

    public String getCreatedby() {
        return createdby;
    }

    public Long getId() {
        return id;
    }

    public String getUniqueid() {
        return uniqueid;
    }

    public String getDescription() {
        return description;
    }

    public LocalDateTime getStartdate() {
        return startdate;
    }

    public LocalDateTime getEnddate() {
        return enddate;
    }

    public String getUniqueidstatus() {
        return uniqueidstatus;
    }

}

第二个,

@Entity
@Table(name="supplierinvite")
public class Rfx_SupplierInvite {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String externalstatus;
    private String uniqueid;

    public String getExternalstatus() {
        return externalstatus;
    }

    public String getUniqueid() {
        return uniqueid;
    }
}

这两个是我创建的实体的存储库。

@Repository("rfxBasicInfoRepository")
public interface Rfx_BasicInfoRepository extends JpaRepository<Rfx_BasicInfo,Long> {
    @Query(value="SELECT u from Rfx_BasicInfo u where u.createdby = :createdby")
    List<Rfx_BasicInfo> findReportByLoginId(@Param("createdby") String createdby);
}


@Repository("rfxSupplierInviteRepository")
public interface Rfx_SupplierInviteRepository extends JpaRepository<Rfx_SupplierInvite,Long> {
    @Query(value="SELECT u.uniqueid, u.externalstatus, count(u.externalstatus) from Rfx_SupplierInvite u  where u.uniqueid in (:uniqueid) group by u.uniqueid,u.externalstatus order by u.uniqueid, u.externalstatus")
    List<Rfx_SupplierInvite> findReportByUniqueId(@Param("uniqueid") String uniqueid);
}

在第一个存储库中,我根据“createdby”字段获取数据,在第二个存储库中,我根据“uniqueid”字段获取数据。这个“唯一”字段在两个表之间是通用的。截至目前,我已尝试单独获取结果并使用类将它们合并为一个。我没有使用任何 JPA 映射和联接,因为我不确定如何在此处正确使用它。

public class Rfx_Model {

    private List<Rfx_BasicInfo> rfx_basicInfoList;
    private  List<Rfx_SupplierInvite> rfx_supplierInviteList;

    public Rfx_Model(List<Rfx_BasicInfo> rfx_basicInfoList, List<Rfx_SupplierInvite> rfx_supplierInviteList) {
        this.rfx_basicInfoList = rfx_basicInfoList;
        this.rfx_supplierInviteList = rfx_supplierInviteList;
    }

    public List<Rfx_BasicInfo> getRfx_basicInfoList() {
        return rfx_basicInfoList;
    }

    public List<Rfx_SupplierInvite> getRfx_supplierInviteList() {
        return rfx_supplierInviteList;
    }


}

这是我的控制器,

@RequestMapping(value="/buyerLandingReport/{LoginID}",method = RequestMethod.GET)
    public ResponseEntity<Object> buyerLandingReport(@PathVariable("LoginID") String LoginID) {
        try{

            List<Rfx_BasicInfo> list1 = rfxBasicInfoRepository.findReportByLoginId(LoginID);
            List<Rfx_SupplierInvite> list2 = rfxSupplierInviteRepository.findReportByUniqueId(list1.get(0).getUniqueid());

            return new ResponseEntity(new Rfx_Model(list1,list2),HttpStatus.OK);

        }
        catch (Exception ex){
            throw ex;
        }
    }

下面是当前的 JSON 输出,

{
    "Rfx_BasicInfo": [
        {
            "id": 1,
            "uniqueid": "RA001",
            "description": "sbhdjajd",
            "uniqueidstatus": "ajsd",
            "startdate": "2018-05-04T12:00:00",
            "enddate": "2018-05-04T12:00:00",
            "createdby": "RIL01"
        },
        {
            "id": 2,
            "uniqueid": "RA001",
            "description": "kasksj",
            "uniqueidstatus": "sjkds",
            "startdate": "2018-05-04T12:00:00",
            "enddate": "2018-05-04T12:00:00",
            "createdby": "RIL01"
        },
        {
            "id": 3,
            "uniqueid": "RA002",
            "description": "asjhkdj",
            "uniqueidstatus": "asjhd",
            "startdate": "2018-05-04T12:00:00",
            "enddate": "2018-05-04T12:00:00",
            "createdby": "RIL01"
        }
    ],
    "Rfx_SupplierInvite": [
        [
            "uniqueid": "RA001",
            "externalstatus":"AC",
            "count": 1
        ],
        [
           "uniqueid": "RA001",
           "externalstatus": "IN",
           "count": 2
        ]
    ]
}

所需的 JSON 输出格式就是这个,

[
    { 
        "Rfx_BasicInfo": {
            "id": 1,
            "uniqueid": "RA001",
            "description": "Auction for taking bid for work on route Tirora Gondiya",
            "uniqueidstatus": "PB",
            "startdate": "2018-05-04T12:00:00",
            "enddate": "2018-05-04T14:00:00",
            "createdby": "RIL03"
        },
        "Rfx_Supplier" : [ 
            {
                  "uniqueid": "RA001",
                  "externalstatus": "AC",
                  "count": 1
            },
            {
                  "uniqueid": "RA001",
                  "externalstatus": "IN",
                  "count": 2
            }
        ]
    },
    { 
        "Rfx_BasicInfo": {
            "id": 2,
            "uniqueid": "RA002",
            "description": "Auction for taking bid for work on route Gondiya  -  Amgaon",
            "uniqueidstatus": "DR",
            "startdate": "2018-05-04T14:00:00",
            "enddate": "2018-05-04T16:00:00",
            "createdby": "RIL03"
        },
        "Rfx_Supplier" : [ 
            {
                  "uniqueid": "RA002",
                  "ExternalStatus": "AC",
                  "count": 1
            },
            {
                  "uniqueid": "RA002",
                  "ExternalStatus": "IN",
                  "count": 2
            }
        ]
    }
]

非常感谢任何能帮助我找出解决方案的建议。

【问题讨论】:

    标签: java json spring-boot spring-data-jpa


    【解决方案1】:

    您真的需要ResponseEntity 吗?如果没有,常用的方法是:

    @RestController
    public class MyController {
    
        @RequestMapping(value="/buyerLandingReport/{LoginID}")
        public Rfx_Model buyerLandingReport(@PathVariable("LoginID") String LoginID) {
            try{
    
                List<Rfx_BasicInfo> list1 = rfxBasicInfoRepository.findReportByLoginId(LoginID);
                List<Rfx_SupplierInvite> list2 = rfxSupplierInviteRepository.findReportByUniqueId(list1.get(0).getUniqueid());
    
                return new Rfx_Model(list1,list2);
    
            }
            catch (Exception ex){
                throw ex;
            }
        }
    

    【讨论】:

    • 我试过了,但它并没有真正帮助我生成所需的 JSON 格式,如上所述。我得到的结果和以前一样。
    【解决方案2】:

    将控制器更改为

    @RequestMapping(value="/buyerLandingReport/{LoginID}",method = RequestMethod.GET)
    public ResponseEntity<Object> buyerLandingReport(@PathVariable("LoginID") String LoginID) {
        try{
    
            List<Rfx_BasicInfo> list1 = rfxBasicInfoRepository.findReportByLoginId(LoginID);
            List<Rfx_SupplierInvite> list2 = rfxSupplierInviteRepository.findReportByUniqueId(list1.get(0).getUniqueid());
    
            List<Rfx_Model> body = Arrays.asList(new Rfx_Model(list1, list2);
            return new ResponseEntity(body), HttpStatus.OK);
    
        }
        catch (Exception ex){
            throw ex;
        }
    }
    

    您需要返回一个列表(或数组)才能获得一个 json 数组响应。

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2018-04-09
      • 1970-01-01
      • 2020-03-01
      • 2019-07-27
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多