Spring Boot REST поиск по первым символам
Делаю Spring-boot back-end rest-приложение.
Ребята на фронте делают поиск, куда пользователь будет вводить наименование, а ему будет выпадать подсказка в виде списка из существующих в БД наименований.
И происходить это должно так сказать онлайн. Т.е. Начал вводить пользователь Н - ему сразу выпал список наименований на Н, продолжил вводить НИ - список подсказок тут же обновляется и т.д.
Как на беке правильно сделать REST?
Сделать в контроллере обработку обычного запроса, например:
@GetMapping("/find")
public Map<String,String> find(
@ApiParam("name")
@NotBlank @RequestParam String name) {
return organizationService.find(name);
}
и соответственно из БД делать выборку запросом вроде:
public interface StudentRepo extends JpaRepository<Student, Long> {
Optional<List<Student>> findStudentsByNameStartsWith(String name);
}
это то, что пришло мне на ум... Но если в БД будет огромный список и/или БД будет сильно нагружена, то скорость отклика будет низкой...
Может для таких задач существует другое решение?
Ответы (1 шт):
Вы все правильно делаете, но выбирать все значения в строку поиска очень неоптимально (а если значений будет 100000, а если миллион?).
Учитывая, что это поисковый запрос, то можно решить несколькими способами:
Решение в лоб. Добавляете ограничение на количество элементов, пишете вручную запрос и задаете фиксированное количество элементов. Должно получиться что-то такое:
public interface StudentRepo extends JpaRepository<Student, Long> { @Query(value = "select * from Students where name = ?1 limit ?2", nativeQuery = true) Optional<List<Student>> findStudentsByNameStartsWith(String name, Long limit); }Правильно и с пагинацией
public interface StudentRepo extends JpaRepository<Student, Long> { Optional<List<Student>> findStudentsByNameStartsWith(String name, Pageable pageable); }
И полезные ссылки для ознакомления