Назад к вопросам
Senior
5
Как строить динамические запросы, если условия фильтрации заранее неизвестны (например, 10 опциональных полей)?
Компании, где спрашивали
Velenes.Tech
Ответ от нейросети
sobes.tech AI
Для построения динамических запросов с множеством опциональных фильтров в Java часто используют паттерн "Builder" или специальные API для построения запросов, например, Criteria API в JPA или QueryDSL.
Основная идея — последовательно добавлять условия в запрос только если соответствующее поле присутствует и не пустое. Это позволяет избежать громоздких вложенных if и конкатенации строк.
Пример с использованием JPA Criteria API:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> cq = cb.createQuery(Entity.class);
Root<Entity> root = cq.from(Entity.class);
List<Predicate> predicates = new ArrayList<>();
if (filter.getField1() != null) {
predicates.add(cb.equal(root.get("field1"), filter.getField1()));
}
if (filter.getField2() != null) {
predicates.add(cb.like(root.get("field2"), "%" + filter.getField2() + "%"));
}
// ... добавляем остальные условия по аналогии
cq.where(cb.and(predicates.toArray(new Predicate[0])));
List<Entity> results = entityManager.createQuery(cq).getResultList();
Такой подход гибкий, безопасный (нет риска SQL-инъекций) и легко расширяемый при добавлении новых фильтров.