Часто нам бывает нужно вывести на странице не все данные, а только те, которые соответствуют определённому критерию. Например, нам нужно получить всех пользователей старше 18 лет. Для этого используется фильтрация
Сущность
Для примера возьмем пользователя
@Entity
public class User {
private long id;
private String name;
private Integer age;
}
Репозиторий
@Repository
public interface UserRepository extends
// Наследуем репозиторий от этих классов
JpaRepository<User, Long>,
QuerydslPredicateExecutor<User>,
QuerydslBinderCustomizer<QUser> {
// Чтобы не возникала ошибка, нужно переопределить в репозитории метод customize
// Если не нужно ничего кастомизировать, метод оставляем пустым
// Класс QUser автоматически генерируется при компиляции, если добавить нужные зависимости
// и процессоры аннотаций. Изучите зависимости в файле build.gradle
@Override
default void customize(QuerydslBindings bindings, QUser user) {
}
}
Для работы querydsl нужно подключить некоторые зависимости и процессоры аннотаций
// Фрагмент файла build.gradle
// Подключаем querydsl
implementation 'com.querydsl:querydsl-core:5.0.0'
implementation 'com.querydsl:querydsl-jpa:5.0.0'
// Благодаоя этой зависимости при компиляции будут сформированы Q классы
annotationProcessor(
'com.querydsl:querydsl-apt:5.0.0:jpa',
'javax.annotation:javax.annotation-api:1.3.2',
'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'
Контроллер
@RestController
@RequestMapping("/companies")
public class UsersController {
@Autowired
private UserRepository userRepository;
// Ищем всех пользователей с определенным именем
public Iterable<User> getUsersByName(String name) {
return userRepository.findAll(QUser.user.name.eq(name));
// eq() – равно
}
// Ищем всех пользователей в возрастом в заданном диапазоне
// включая границы диапазона
public Iterable<User> getUsersByAge(Integer minAge, Integer maxAge) {
return userRepository.findAll(QUser.user.age.goe(minAge).and(QUser.user.age.loe(maxAge)));
// goe() – больше либо равно
// loe() – меньше либо равно
}
// Ищем всех пользователей, чьё имя не совпадает с переданным
public Iterable<User> getUsersExcludingName(String name) {
return repository.findAll(QUser.user.name.ne(name));
// ne() – не равно
}
}

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.