Sobes.tech
Senior
60

Comment construire des requêtes dynamiques si les conditions de filtrage sont inconnues à l'avance (par exemple, 10 champs optionnels) ?

Entreprises à qui on a demandé
Velenes.Tech

Réponse de l'IA

sobes.tech IA

Для построения динамических запросов с множеством опциональных фильтров в 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-инъекций) и легко расширяемый при добавлении новых фильтров.