Что не так с этим JPA @ Query?

#sql #spring #database #jpa #h2

#sql #spring #База данных #jpa #h2

Вопрос:

У меня есть приложение Spring Boot, использующее Spring Data JPA в соединении с базой данных H2. Я попытался написать @Query метод в одном из своих JpaRepositories , но он всегда возвращает пустую коллекцию, и я не знаю почему.

 public interface ProductService extends JpaRepository<Product, Long> {
    @Query(value = "SELECT * FROM product WHERE category=':category'", nativeQuery = true)
    List<Product> getCategory(@Param("category") String category);
}
  

Я поместил этот код выше только потому, что уверен, что данные присутствуют в базе данных. Я проверил это, запустив точно такой же запрос из H2-console, и он работает каждый раз. В чем здесь может быть проблема?

Комментарии:

1. Вам не обязательно содержать переменную, помеченную @param внутри кавычек. Удалите кавычки. Итак, предложение where выглядит следующим образом where category=:category

Ответ №1:

Использование чистого JPA:

List<Product> findAllByCategory(String category);

Использование собственного запроса:

 @Query(value="SELECT * FROM product WHERE category=?1;",nativeQuery=true)
List<Product> getAllByCategory(String category);
  
 @Query(value="SELECT * FROM product WHERE category=:category;",nativeQuery=true)
List<Product> getAllByCategory(@Param String category);
  

Лично я бы использовал версию JPA, поскольку вы, возможно, в будущем захотите использовать конечную точку подкачки Spring, поэтому захотите передать Pageable параметр в репозиторий.

List<Product> findAllByCategory(String category,Pageable page);

Комментарии:

1. Я не думаю, что есть что-то неправильное в том, как он передает параметры. Это кавычки

Ответ №2:

Вы пробовали

 @Query(value = "SELECT * FROM product p WHERE p.category=:category", nativeQuery = true)
  

https://www.baeldung.com/jpa-query-parameters

Ответ №3:

Вы можете попробовать, указав псевдоним для таблицы и выбрав то же имя псевдонима вместо *, как показано ниже

 @Query(value = "SELECT p FROM Product p WHERE p.category = :category")
List<Product> getCategory(@Param("category") String category);