Ускоренная загрузка многие ко многим ПОЛУЧАЮТ запрос

#java #spring-boot #jpa #spring-data-jpa #many-to-many

#Ява #пружинный ботинок #jpa #весна-данные-jpa #многие ко многим

Вопрос:

У меня есть отношения «многие ко многим» в моем приложении для весенней загрузки. Но когда я пытаюсь получить ответ, я всегда получаю пустой массив; Вот мои классы(я вставил код без конструктора, геттеров и сеттеров, но они есть в моем коде):

 @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 Setlt;ProductOrderDetailsgt; 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 Listlt;ProductOrderDetailsgt; 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;  

Вот мой код контроллера заказа:

 @GetMapping("/{id}")  public Order One(@PathVariable Long id) {  Order order=repository.findById(id).orElseThrow(()-gt;new ObjectNotFoundException(id));  return order;  }  

И вот какой ответ я получаю:

 {  "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

Ответ №1:

У вас есть пара возможностей сделать это:

  • Используя тип выборки.НЕТЕРПЕЛИВАЯ стратегия
 @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 Setlt;ProductOrderDetailsgt; productOrderDetails;  @DateTimeFormat  private Date shippmentDate;  private double totalOrderPrice;  private OrderStatus status;  private String note1;  private String note2; }  
  • Использование выборки объединения в вашем пользовательском методе репозитория:
 @Query(value = "SELECT o FROM Order o JOIN FETCH o.productOrderDetails") Listlt;Ordergt; findAllOrders();  

Комментарии:

1. Извините, если я не был ясен, но я хочу, чтобы в моем ответе JSON «productOrderDetails» не было пустого массива null, я хочу, чтобы «productOrderDetails» содержал список заказанных продуктов, когда я получу запрос.

2. Вы пробовали какой-либо из этих подходов?

3. Да, я пробовал: @Query("SELECT o FROM Order o left outer join fetch o.productOrderDetails pod left outer join fetch pod.product where o.id=:id") Order getOrderById(@Param("id") Long id); но я всегда получаю «productOrderDetails» пустыми. Я не уверен, что проблема в классах

Ответ №2:

Итак, для всех, у кого была та же проблема, что и у меня, у меня была ошибка опечатки в классе Order, который я должен был использовать:

 @OneToMany(mappedBy = "order",fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},orphanRemoval = true)  private Setlt;ProductOrderDetailsgt; productOrderDetails;  

вместо mappedBy=»продукт». И если вы не хотите, чтобы при выполнении запроса GET выполнялся рекурсивный вызов, вам следует добавить класс ProductOrderDetails @JsonIgnore:

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

Остальная часть кода остается неизменной.