#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;
Остальная часть кода остается неизменной.