簡體   English   中英

在 RESTful Spring 引導應用程序中,如何對嵌套的 object 屬性進行 url 查詢?

[英]In a RESTful Spring Boot application, how do I do url queries of nested object properties?

在這里,我們使用以下類CustomerAddress 假設實現了 getter 和 setter,並且構造函數填充除了自動填充的id之外的所有字段:

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    @OneToOne
    private Address address;
    /** ... */
}
@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String street;
    private String city;
    private String state;
    private String zipCode;
    /** ... */
}

請注意字段state如何嵌套在Customer class 內部的Address實例 object 內。

現在我們的項目實現了JpaRepository<Customer, Long>接口以處理所有查詢,並且所述接口包括一個findAll function ,它采用Example<Customer>並根據該示例搜索數據庫。 所以我們設置了我們的處理程序

@GetMapping
public ResponseEntity<List<Customer>> getCustomers(@Valid Customer customer) {
    /** call to customerRepository.findAll(Example.of(customer)) inside here */
}

現在在我們的 RESTful 應用程序中,我們輸入 URL /customers?state=IL ,期望輸入customer參數

new Customer(null, null, new Address(null, null, "IL", null))

但相反,它被喂食

new Customer(null, null, null)

為什么會這樣,我們必須做些什么來確保通過第一個 object 而不是第二個?

解決此問題的最簡單方法是使用 @Embedded 和 @Embeddable 注釋。


@Entity
public class Customer{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
@Embedded
private Address address;
}


@Entity
@Embeddable 
public class Address{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String street;
private String city;
private String state;
private String zipCode
}

這將解決您的問題,@Embedded 會將地址嵌入到客戶實體中,從而解決您的問題。

如果您使用 '@Valid Customer customer' 並且當您使用 '/customers?state=IL' 時,將不會自動創建地址實例。

因為你的請求等待一個body。 在這里,如果你想初始化一個地址,你應該輸入 @param(´state') String state 並手動實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM