[英]In a RESTful Spring Boot application, how do I do url queries of nested object properties?
在這里,我們使用以下類Customer
和Address
。 假設實現了 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.