Рекурсивная спецификация поиска для сущностей в отношениях ManyToOne - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующие классы, которые определяют отношения между двумя сущностями, и я построил критерии поиска, которые, кажется, работают для базового варианта использования: сущности, как показано ниже (некоторая информация опущена для краткости!):

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 (сандалии), я хочу иметь возможность использовать эти продукты, когда использую поиск "обувь" по имени атрибута.

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