Я написал такой инструмент (используя спецификацию JPA)
Код: Выделить всё
@Tool(description = "Find Page of employees with filtering options")
public EmployeePageRes findAllFilteredEmployees(@ToolParam(description = "Filtering options for employee search") EmployeeFilter option) {
Pageable pageable = PageRequest.of(option.getPage(), option.getLimit());
log.info("Finding all filtered employees with options: {}", option);
Specification spec = Specification.where(null);
if (option.getEmployeeId() != null) {
spec = spec.and(EmployeeSpecification.hasEmployeeId(option.getEmployeeId()));
}
if (option.getFirstName() != null) {
spec = spec.and(EmployeeSpecification.hasFirstName(option.getFirstName()));
}
if (option.getLastName() != null) {
spec = spec.and(EmployeeSpecification.hasLastName(option.getLastName()));
}
if (option.getEmail() != null) {
spec = spec.and(EmployeeSpecification.hasEmail(option.getEmail()));
}
if (option.getPhone() != null) {
spec = spec.and(EmployeeSpecification.hasPhone(option.getPhone()));
}
if (option.getHireDateFrom() != null || option.getHireDateTo() != null) {
spec = spec.and(EmployeeSpecification.hireDateBetween(option.getHireDateFrom(), option.getHireDateTo()));
}
if (option.getManagerId() != null) {
spec = spec.and(EmployeeSpecification.hasManagerId(option.getManagerId()));
}
if (option.getJobTitle() != null) {
spec = spec.and(EmployeeSpecification.hasJobTitle(option.getJobTitle()));
}
if (option.getMinSalary() != null || option.getMaxSalary() != null) {
spec = spec.and(EmployeeSpecification.salaryBetween(option.getMinSalary(), option.getMaxSalary()));
}
Page employeePage = employeeRepository.findAll(spec, pageable);
return EmployeePageRes.builder()
.employees(employeePage.getContent())
.totalPages(employeePage.getTotalPages())
.totalElements(employeePage.getTotalElements())
.page(employeePage.getNumber())
.limit(employeePage.getSize())
.build();
}
запросы, включающие множество сложных условий, таких как AND, OR и вложенные фильтры.
Есть ли какое-либо решение для динамического построения и обработки этих запросов?
(Мне не нужен прямой запрос в базу данных)
Я использую Java с Spring Boot.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... pring-boot
Мобильная версия