Как ставилась задача по формированию условий в запросах
Что проверяют
Как вы строите запросы с условиями, которые зависят от ввода пользователя: фильтры, поиск, отчёты. Интервьюеру важно, не склеиваете ли вы SQL строками и понимаете ли, во что запрос превращается в базе. Следом просят показать, как сделали бы то же самое в Spring Data.
Как отвечать
Расскажите свою историю по схеме «задача, решение, результат», с опорой на реальный экран или отчёт:
- постановка: какие фильтры требовались (период, статус, категория, сумма), какие из них необязательные, как уточняли граничные случаи вроде пустого списка значений или открытого диапазона дат;
- инструмент: в Spring Data JPA это
SpecificationсJpaSpecificationExecutor, где каждое условие отдельный метод, а необязательные просто не добавляются. Альтернативы: Criteria API, Querydsl сBooleanBuilder, jOOQ для типобезопасного SQL. Для простых случаев хватает@Queryс именованными параметрами; - безопасность: значения идут только параметрами (
PreparedStatement,:param), а в текст запроса попадают лишь имена колонок из белого списка, например для сортировки; - производительность: план через
EXPLAIN ANALYZE, индексы под частые комбинации фильтров, пагинация по ключу вместо большогоOFFSET; - результат: время ответа до и после, как покрыли тестами комбинации фильтров.
Цифры берите свои и будьте готовы объяснить, как мерили. Если такой задачи у вас не было целиком, опишите ближайшую, например поиск по двум полям с сортировкой, и расскажите, как расширили бы решение на десяток фильтров.
Где спотыкаются
Склеивают условия конкатенацией строк с пользовательским вводом. Даже с оговоркой «мы экранировали» после такого ответа разговор про безопасность уже не спасти.
Пишут один «универсальный» запрос вида WHERE (:status IS NULL OR status = :status) для всех фильтров и не знают, что с общим планом база часто не может нормально использовать индекс.
Называют круглые проценты ускорения без базовой линии и методики замера. Первый же вопрос «а как считали?» такой ответ разваливает.