Родительский цикл Spring Data JPA

#mysql #spring #spring-boot #spring-data-jpa

#mysql #весна #весенняя загрузка #spring-data-jpa

Вопрос:

     @Entity
    public class Product {
        @Id
        @Column(unique = true)
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String title;
        @OneToOne
        private Brand brand;
        @OneToOne(fetch = FetchType.EAGER)
        @OnDelete(action = OnDeleteAction.CASCADE)
        private Category category;
}
    
    @Entity
    public class Category {
        @Id
        @Column(unique = true)
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        @NotBlank(message = "Please enter category name!")
        @Length(max = 50, message = "Maximum size exceeded!")
        private String name;
        @OneToOne
        private Category parent;
}
 

Возможно ли создать рекурсивный запрос, который будет выполнять цикл по всем родительским категориям продукта?

Допустим, я нахожусь в категории для Woman, он будет проходить через все категории родителей, и если один из них соответствует для Woman, он вернет его продукты..

введите описание изображения здесь

В принципе, я хочу что-то вроде этого (запрос к нему)..

   List<ProductOption> productOptions = new ArrayList<>();

        Category mainCategory = categoryRepository.findById(id);

            for(Category category : categoryRepository.findAll()){
                Category cat = category;
                while(cat!=null){
                    if(cat==mainCategory){
                        productOptions.addAll(productOptionRepository.findAllByProduct_CategoryId(category.getId()));
                    }
                    cat=cat.getParent();
                }
             }
 

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

1. Может быть, вы могли бы написать представление mysql CTE для рекурсивного запроса и сопоставить объект с этим представлением

2. Можете ли вы описать проблему перед кодом?

3. Каждый продукт получил свою категорию… Категория может принадлежать другой категории (родительской категории).. Итак, допустим, я хочу найти товары из категории для женщины.. Это не проблема… Но я хочу выбрать все продукты, которые относятся к категории родителей, включая категорию для женщин..

Ответ №1:

Может быть, не самое правильное решение, но работает так, как должно

       @Query(value = "SELECT * FROM product_option p WHERE  p.sale_closed is false AND p.product_id 
                      IN(SELECT id from product where category_id 
                      IN(WITH RECURSIVE cte (id) AS (SELECT id FROM category WHERE id =:parentId 
                      UNION SELECT t1.id FROM category t1 
                      INNER JOIN cte t2 ON t1.parent_id = t2.id) SELECT * FROM cte))",nativeQuery=true)
      Page<ProductOption> findByCategory(Integer parentId,Pageable pageable);