Как я могу реализовать сложные запросы API с помощью Spring Boot/JPA?JAVA

Программисты JAVA общаются здесь
Anonymous
Как я могу реализовать сложные запросы API с помощью Spring Boot/JPA?

Сообщение Anonymous »

Я разрабатываю API для курсов колледжа и хочу, чтобы запросы могли обрабатывать несколько параметров запроса, которые по-разному уточняют поиск. Пример с двумя параметрами:
http://url.com/api/courses/search?subje ... umber=1302
Я пытаюсь найти способ обработки всех различных параметров заголовка поиска в одном методе класса обслуживания. Я хочу, чтобы параметры могли быть в любом порядке и с любым количеством параметров (запрос может иметь 0 или столько, сколько поддерживает API). На данный момент код настроен на поддержку только одного параметра за раз. Заголовок темы принимает любые параметры, а список распаковывается в CourseService.java. Я предполагаю, что есть более простой способ сделать это, чем писать новый случай if для каждой комбинации параметров?
Возможно, что-то вроде этого псевдокода, каждый из которых дополнительно уточняет прошлый результат:
search(fullDatabase, param1);
search(search1, param2);
search(search2, param3);

Вот мой текущий код:
CourseController.java
@RestController
@RequestMapping("/api/courses")
public class CourseController {

@Autowired
private CourseService courseService;

@RequestMapping("/search")
public List searchCourses(@RequestParam Map params) {
return courseService.getCourses(params);
}
}

CourseService.java
@Service
public class CourseService {

@Autowired
private CourseRepository courseRepository;

/** Handles all logic for query parameters. */
public List getCourses(Map params) {
if (params.keySet().contains("crn")) {
return courseRepository.findByCrn(params.get("crn"));
} else if (params.keySet().contains("subject")) {
return courseRepository.findBySubject(params.get("subject"));
} else if (params.keySet().contains("number")) {
return courseRepository.findByNumber(params.get("number"));
} else if (params.keySet().contains("seats")) {
return courseRepository.findBySeats(params.get("seats"));
}
throw new QueryArgumentException(null, getClass(), params);
}
}

CourseRepository.java
@Repository
public interface CourseRepository extends JpaRepository {

@Query("FROM Course WHERE crn = ?1")
List findByCrn(String crn);

@Query("FROM Course WHERE subject = ?1")
List findBySubject(String subject);

@Query("FROM Course WHERE number = ?1")
List findByNumber(String number);

@Query("FROM Course WHERE department = ?1")
List findByDepartment(String department);

@Query("FROM Course WHERE seats >= ?1")
List findBySeats(String seats);
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... g-boot-jpa

Вернуться в «JAVA»