У меня есть следующие классы, которые определяют отношения между двумя сущностями, и я построил критерии поиска, которые, кажется, работают для базового варианта использования: сущности, как показано ниже (некоторая информация опущена для краткости!):
public class Category implements Serializable {
@Id
private Long id;
private String name;
@ManyToOne
private Category parent;
}
//getters ands setters
public class Product implments Serializable {
@Id
private Long id;
private String name;
..
@ManyToOne
private Category category;
}
//getters and setters
Моя поисковая спецификация для названия категории выглядит следующим образом:
public class ProductSearchSpecification extends BaseSpecification<Product, ProductSearchtRequest> {
@Override
public Specification<Product> getFilter(ProductSearchRequest request) {
return (root, query, cb) -> {
query.distinct(true);
return where(categoryNameContains(request.categoryName))
.toPredicate(root, query, cb);
};
}
private Specification<Product> categoryNameContains(String categoryName) {
return categoryAttributeContains("name", categoryName);
}
private Specification<Product> categoryAttributeContains(String attribute, String value) {
return (root, query, cb) -> {
if (value == null) {
return null;
}
Join<Product, Category> category = root.join("category");
return cb.like(
cb.lower(category.get(attribute)),
containsLowerCase(value)
);
};
}
This works as expected. I however want to recursively search for all the child categories and get the products as well, ie if I have the following data
{id: 1,name:"Fashion"},
{id: 20, "name":"Footwear","parentId":1},
{id: 25, "name":"Sandals","parentId":20}
и несколько продуктов с категорией 25 (сандалии), я хочу иметь возможность использовать эти продукты, когда использую поиск "обувь" по имени атрибута.