Как правильно реализовать запрос поиска в JPA
Я использую JPA для конструирования Rest API моего приложения. Я хочу получить список вещей из items по полю cities_id и categories_id
У меня уже есть интерфейс, который позволяет мне использовать стандартные методы findAll и т.п. Я попытался определить свой запрос через аннотацию Query.
public interface ItemsRepositories extends JpaRepository<Items, Long> {
@Query("FROM items WHERE cities_id = ?1 AND categories_id = ?2")
List<Items> findItemsByCityAndCategory(Cities city_id, Categories category_id);
}
И вызвать метод в контроллере:
@GetMapping("{city_id}/{category_id}")
public List<Items> getItemByCityAndCategory(@PathVariable("city_id") Cities city, @PathVariable("category_id") Categories category) {
return itemsRepositories.findItemsByCityAndCategory(city, category);
}
Однако я получаю ошибку:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'itemsController' defined in file
[C:\Users\home\Desktop\example\target\classes\demoapi\controllers\ItemsController.class]: Unsatisfied dependency expressed through constructor parameter 0;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'itemsRepositories': Invocation of init method failed;
nested exception is java.lang.IllegalArgumentException:
Validation failed for query for method public abstract java.util.List demoapi.repositories.ItemsRepositories.findItemsByCityAndCategory(demoapi.entities.Cities,demoapi.entities.Categories)!
Вопрос: как это правильно организовать со стороны JPA? Иными словами, я могу отказаться от этого решения и просто обработать список прямо в контроллере, отделив нужное от остального, но мне хотелось бы реализовать фильтрацию именно на стороне БД и получить только те записи, которые действительно нужны, используя JPA.
Ответы (1 шт):
Ошибка указывает, что не может создать bean класса ItemsRepositories, из за того, что у вас находится ошибка в запросе
Если вы используете не nave qury, то должны указывать класс который хотите получить с запроса
Это должно решить вашу проблему
@Query(value = "SELECT i FROM Items i WHERE i.cities_id = ?1 AND i.categories_id = ?2")