Что такое Querydsl?

«Что такое Querydsl?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Querydsl — это Java-библиотека для построения типобезопасных запросов через fluent API. Она генерирует метамодель (Q-классы) на основе сущностей, что позволяет проверять корректность запроса на этапе компиляции.

Основные преимущества:

  • Типобезопасность: Ошибки в именах полей или типах условий обнаруживаются компилятором.
  • Fluent API: Читаемый и выразительный синтаксис, похожий на SQL.
  • Поддержка多种 бэкендов: JPA, SQL, JDO, MongoDB, Lucene и др.
  • Динамические запросы: Удобна для построения запросов с изменяемыми условиями.

Пример запроса к JPA:

// Q-класс сгенерирован для сущности Employee
QEmployee employee = QEmployee.employee;

JPAQuery<Employee> query = new JPAQuery<>(entityManager);
List<Employee> result = query.select(employee)
    .from(employee)
    .where(
        employee.department.name.eq("Engineering")
        .and(employee.salary.gt(100000))
        .and(employee.active.isTrue())
    )
    .orderBy(employee.lastName.asc())
    .fetch();

Интеграция с Spring Data JPA: Можно использовать через QuerydslPredicateExecutor.

public interface EmployeeRepository extends JpaRepository<Employee, Long>, QuerydslPredicateExecutor<Employee> {}

// Использование в сервисе
BooleanBuilder predicate = new BooleanBuilder();
predicate.and(employee.department.id.eq(deptId));
if (StringUtils.hasText(name)) {
    predicate.and(employee.firstName.containsIgnoreCase(name));
}
Page<Employee> page = employeeRepository.findAll(predicate, PageRequest.of(0, 10));

Процесс работы:

  1. На этапе сборки (через APT или аннотационный процессор) генерируются Q-классы (например, QEmployee).
  2. Разработчик использует эти классы для построения запросов в коде.
  3. Querydsl преобразует вызовы API в целевой язык запросов (JPQL, SQL и т.д.).

Альтернативы: JPA Criteria API (более многословный), Spring Data JPA @Query (статичные запросы).