#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);