Как искать результаты запроса, которые также соответствуют фильтру в поиске Hibernate - PullRequest
0 голосов
/ 04 февраля 2020

Я использую Hibernate Search 6 с elasti c бэкэндом поиска.
Я использую следующее для поиска названий книг.

Search.session(entityManager)
            .search(Book.class)
            .predicate(f -> query == null || query.trim().isEmpty() ? f.matchAll()
                    : f.simpleQueryString()
                        .field("title")
                        .matching(query))
            .fetchHits(10);  

Теперь у моей сущности Book есть логическое поле inStock. Я хотел бы, чтобы мои результаты поиска в спящем режиме включали только те книги, где inStock соответствует действительности. Я мог бы сделать фильтр в java в результирующем списке, но это испортило бы нумерацию страниц и не было бы таким элегантным решением, как в самом запросе

1 Ответ

1 голос
/ 04 февраля 2020

Может быть, что-то вроде этого?

Search.session(entityManager).search(Book.class)
        .predicate(f -> f.bool(b -> { 
            b.must(f.match().field("inStock").matching(true));
            if (query != null && !query.trim().isEmpty()) { 
                b.must(f.simpleQueryString().field("title")
                        .matching(query));
            }
        }))
        .fetchHits(10);  

Или, если "inStock" передан в качестве параметра и может быть null (для обозначения "нет ограничений по состоянию на складе"):

Search.session(entityManager).search(Book.class)
        .predicate(f -> f.bool(b -> { 
            b.must(f.matchAll()); // Match everything by default, if there are no constraints
            if (inStock != null) {
                b.must(f.match().field("inStock").matching(true));
            }
            if (query != null && !query.trim().isEmpty()) { 
                b.must(f.simpleQueryString().field("title")
                        .matching(query));
            }
        }))
        .fetchHits(10);  

См. этот раздел документации , особенно последний пример ("Простое динамическое добавление предложений с использованием лямбда-синтаксиса")

...