Senior
57
Чӣ гуна сохтани дархостҳои динамикӣ, агар шароити филтр пешакӣ маълум набошанд (масалан, 10 майдони интихобӣ)?
Ширкатҳо дар куҷо пурсиданд
Velenes.Tech
Ҷавоб аз AI
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-инъекций) и легко расширяемый при добавлении новых фильтров.