Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Фильтрация Java: Корпоративные приложения на Spring Boot

Часто нам бывает нужно вывести на странице не все данные, а только те, которые соответствуют определённому критерию. Например, нам нужно получить всех пользователей старше 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() – не равно
    }
}

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 21 сентября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»