Ответ
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));
Процесс работы:
- На этапе сборки (через APT или аннотационный процессор) генерируются Q-классы (например,
QEmployee). - Разработчик использует эти классы для построения запросов в коде.
- Querydsl преобразует вызовы API в целевой язык запросов (JPQL, SQL и т.д.).
Альтернативы: JPA Criteria API (более многословный), Spring Data JPA @Query (статичные запросы).