首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sping boot多对多GET请求

Sping boot多对多GET请求
EN

Stack Overflow用户
提问于 2021-11-28 21:43:34
回答 2查看 49关注 0票数 0

我的Spring启动应用程序中有多对多关系。但是当我尝试获取响应时,我总是得到一个空数组;下面是我的类(我粘贴了没有构造函数、getter和setter的代码,但我在代码中有它们):

代码语言:javascript
复制
@Entity
@Table(name="orders")
public class Order {
    private @Id
    @GeneratedValue
    Long id;
    @OneToOne(cascade = CascadeType.ALL)
    private Customer customer;
    @OneToMany(mappedBy = "product",fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},orphanRemoval = true)
    private Set<ProductOrderDetails> productOrderDetails;
    @DateTimeFormat
    private Date shippmentDate;
    private double totalOrderPrice;
    private OrderStatus status;
    private String note1;
    private String note2;

@Entity
@Table
public class Product {
    private @Id
    @GeneratedValue
    Long id;
    private String name;
    private String model;
    private String color;
    private String material;
    private double price;
    @Transient
    private int productQuantity;
    @OneToMany(mappedBy = "order",fetch = FetchType.LAZY)
    private List<ProductOrderDetails> productOrderDetailsSet;

@Entity
@IdClass(ProductOrderDetails.class)
public class ProductOrderDetails implements Serializable {

    @Id
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="order_id")
    Order order;

    @Id
    @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH})
    @JoinColumn(name="product_id")
    Product product;

    private int quantity;

下面是我的OrderController代码:

代码语言:javascript
复制
@GetMapping("/{id}")
    public Order One(@PathVariable Long id) {
        Order order=repository.findById(id).orElseThrow(()->new ObjectNotFoundException(id));
      return order;
    }

这是我得到的回应:

代码语言:javascript
复制
{
    "id": 2,
    "customer": {
        "id": 1,
        "name": "Company",
        "address": "Main Street 1",
        "city": "Bern",
        "state": "Switzerland",
        "zip": 58529,
        "contactPersonName": "John Smith",
        "contactPersonEmail": "test@gmail.com"
    },
    "productOrderDetails": [],
    "shippmentDate": "2020-12-09T23:00:00.000+00:00",
    "totalOrderPrice": 3434.0,
    "status": "WAITING",
    "note1": "note 1",
    "note2": "note 2"
}

如何获取productOrderDetails数组(已订购的产品数组)?如果我可以使用JPA,我会更喜欢

EN

回答 2

Stack Overflow用户

发布于 2021-11-28 21:48:45

您有几种方法可以做到这一点:

  • Using FetchType.EAGER strategy

代码语言:javascript
复制
@Entity
@Table(name="orders")
public class Order {
    private @Id
    @GeneratedValue
    Long id;
    @OneToOne(cascade = CascadeType.ALL)
    private Customer customer;
    @OneToMany(mappedBy = "product",fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},orphanRemoval = true)
    private Set<ProductOrderDetails> productOrderDetails;
    @DateTimeFormat
    private Date shippmentDate;
    private double totalOrderPrice;
    private OrderStatus status;
    private String note1;
    private String note2;
}

在自定义存储库方法中使用联接获取的

代码语言:javascript
复制
@Query(value = "SELECT o FROM Order o JOIN FETCH o.productOrderDetails")
List<Order> findAllOrders();
票数 0
EN

Stack Overflow用户

发布于 2021-12-13 23:25:28

所以对于任何和我有同样问题的人来说,我有一个拼写错误,在我应该使用的Order类中:

代码语言:javascript
复制
  @OneToMany(mappedBy = "order",fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},orphanRemoval = true)
    private Set<ProductOrderDetails> productOrderDetails;

而不是mappedBy=的“产品”。如果你不想在GET请求时进行递归调用,你应该在ProductOrderDetails类中添加@JsonIgnore:

代码语言:javascript
复制
@Id
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="order_id")
@JsonIgnore
Order order;

代码的其余部分保持不变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70147712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档