Предикаты динамического фильтра Querydsl в зависимости от результата поиска
Я разработал поиск продуктов с помощью Spring MVC и Spring Data. Пользователи могут искать товары по названию / описанию (Ручной ввод. Поиск по названию товара # и описанию товара со словом "лайк") или по категории (ссылка кликабельна). Когда результат отображается, пользователи должны иметь возможность сузить результат с помощью некоторых предикатов фильтра, таких как цена, размер, цвет и т. Д. Поэтому я реализовал некоторые предикаты Querydsl.
Допустим, пользователь нашел красные, зеленые и желтые продукты, тогда я хочу показать только эти цвета в моем фильтре. Я не хочу использовать статические значения и предоставлять все возможные цвета, которые вы можете себе представить.
Я не могу перебрать весь результат и поместить все доступные цвета в список, так как я использую Пейджинг, поэтому у меня нет полного набора результатов в куче для перебора.
Нужно ли выполнять дополнительный SQL-запрос для каждого предиката фильтра в наборе результатов? Я подумал о дополнительной таблице с предварительно вычисленными результатами. Ну, я мог бы использовать это для поиска категории. Но так как пользователи могут также выполнять поиск вручную по названию продукта и описанию продукта, я не могу предсказать каждую возможную строку поиска...
Продукты меняются ежедневно, потому что я делаю несколько импортов Spring Batch CSV каждую ночь (обновление, удаление и добавление продуктов).
Любая идея?
Спасибо
Ник
1 ответ
Решил это. Создан пользовательский запрос с предикатом, содержащим строку поиска или категорию. Если установлен атрибут фильтра, я добавляю его как внутреннее соединение к запросу. В фильтре у меня есть список для каждого атрибута, содержащего допустимые значения. Например
...
query.from(product).where(predicate);
if(isColorFilterSet()) {
JPAQuery colorQuery = query.from(color).innerJoin(product.colors, color)
.groupBy(color);
List<Color> colors = colorQuery.list(color);
filter.setFilterableBaseColors(colors);
}