У меня было требование в одном из моих тестов на собеседовании с использованием Spring Boot, где мне нужно было создать конечную точку, которая принимает множество необязательных параметров запроса, а затем возвращает список автомобилей на основе этих параметров, таких как модель автомобиля, номерной знак, двигательтип, производитель, водитель, компания, которой она была арендована и т. д. и т. д. И автомобиль, водитель и производитель - это отдельные объекты.
Я реализую эту функциональность в JPARepository с помощью одного запроса JPQL, реализующего СЛЕДУЮЩИЕ СОЕДИНЕНИЯ, и фильтрую гденапример, licensePlate = licensePlateParameter ИЛИ licensePlatParameter имеет значение null и т. д.
Решение работало, однако интервьюер сказал, что решение является масштабируемым и обслуживаемым.Я должен был реализовать это с помощью предикатов.Может кто-нибудь показать мне пример того, как я могу реализовать такую функциональность, используя предикаты, которые легче поддерживать?Буду весьма признателен за некоторые примеры с кодом.
Я подумал, что был умен, поставив оба необязательных параметра и нашел записи в одном вызове, проверив, является ли параметр нулевым или нет.Другой вопрос, связанный с этим, который я имею в виду, это действительно хорошая практика, чтобы получить все записи из БД и затем отфильтровать их с помощью предикатов?Также, как мы фильтруем, когда задействовано несколько объектов / сущностей, предикаты могут быть созданы для одного типа.
@Query("SELECT d FROM Driver d LEFT JOIN d.car c WHERE (d.name = :name OR :name is null) "
+ "and (c.licensePlate = :licensePlate OR :licensePlate is null) "
+ "and (c.rating = :rating OR :rating is null) " and so on
List<Driver> findByAttributes(@Param("name") String name,
@Param("licensePlate") String licensePlate,
@Param("rating") Integer rating,
and so on);